socket-python应用:控制泓格ET-7044通信模块输入DI输出DO
本节主要内容:
1、socket-python建立TCP通信
2、配合泓格通信模块说明书,查看输入输出寄存器地址,发送指令
3、发送\接收的数据都是16进制,要进行字符处理
物理连接图:
泓格ET7044通信模块编程资料:
输出:
01 02 00 00 00 06 01 05 00 01 FF 00 (01表示第2个输出口、FF表示端口使能输出)
01 02 00 00 00 06 01 05 00 02 00 00 (01表示第2个输出口、00表示端口关闭输出)
输入:
注意:输入 和 输出端口的请求是不同的,数据是以十六进制发送的
第一行是输出端口发送请求数据,其中倒数第3个字节 05 对应第5个输出端口,FF使能输出,将FF变为00关闭输出
第二行是输入端口发送请求数据,其中倒数第3个字节 05 对应第5个输出端口
思路整理:
由于用TCP测试工具发送 01 02 00 00 00 06 01 05 00 01 FF 00 ,可以控制模块的输出口DO1使能,
因此猜想 01 02 00 00 00 06 01 05 00 01 FF 00 ,直接对应的控制 ET-7044模块
故在程序中使用tcp_client.send() 发送相应代码也可以实现控制ET-7044模块端口
代码层面:
将字符串转为16进制格式
"""#将输入的一串10进制字符串,表示为b'\x' 16进制格式 # 010200000006010200000001 ---> \x01\x02\x00\x00\x00\x06\x01\x05\x00\x00\xFF\x00 """ def dataSwitch(data): str1 = '' str2 = b'' while data: str1 = data[0:2] # print(str1) s = int(str1,16) str2 += struct.pack('B',s) data = data[2:] return str2
字符串转为16进制格式
通过发送指令打开所有输入通道,监听是否有输入
#通过发送指令打开所有输入通道,监听是否有输入 while True: inputPort0 = " tcp_client.sendall(dataSwitch(inputPort0)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第0个输入端口的消息') # continue inputPort1 = " tcp_client.sendall(dataSwitch(inputPort1)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第1个输入端口的消息') inputPort2 = " tcp_client.sendall(dataSwitch(inputPort2)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第2个输入端口的消息') inputPort3 = " tcp_client.sendall(dataSwitch(inputPort3)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第3个输入端口的消息') inputPort4 = " tcp_client.sendall(dataSwitch(inputPort4)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第4个输入端口的消息') inputPort5 = " tcp_client.sendall(dataSwitch(inputPort5)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第5个输入端口的消息') inputPort6 = " tcp_client.sendall(dataSwitch(inputPort6)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第6个输入端口的消息') inputPort7 = " tcp_client.sendall(dataSwitch(inputPort7)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第7个输入端口的消息')
发送指令打开所有输入通道,监听是否有输入
手动指定输出端口
#输出D0 while True: DO = input("请输入打开的输出端口(如0、1、2、3、4、5、6、7):") IfAble = input("请输入输出端口是否使能(1、使能,0、关闭):") ": IfAble = "FF" ": IfAble = " # 01 02 00 00 00 06 01 05 00 00 FF 00 data = "0102000000060105000{}{}00".format(DO,IfAble) print(dataSwitch(data)) tcp_client.sendall(dataSwitch(data)) print("已发送消息")
手动控制输出端口DO
最后贴出完整的代码,仅供参考:
from socket import * import struct ip_port = ('192.168.255.1',502) buffer_size = 1024 tcp_client = socket(AF_INET,SOCK_STREAM) tcp_client.connect(ip_port) #将输入的一串10进制字符串,表示为b'\x' 16进制格式 # 010200000006010200000001 ---> \x01\x02\x00\x00\x00\x06\x01\x05\x00\x00\xFF\x00 def dataSwitch(data): str1 = '' str2 = b'' while data: str1 = data[0:2] # print(str1) s = int(str1,16) str2 += struct.pack('B',s) data = data[2:] return str2 #通过发送指令打开所有输入通道,监听是否有输入 # while True: # inputPort0 = "010200000006010200000001" # tcp_client.sendall(dataSwitch(inputPort0)) # if tcp_client.recv(buffer_size)[-1]: # print('收到服务端第0个输入端口的消息') # # continue # # inputPort1 = "010200000006010200010001" # tcp_client.sendall(dataSwitch(inputPort1)) # if tcp_client.recv(buffer_size)[-1]: # print('收到服务端第1个输入端口的消息') # # inputPort2 = "010200000006010200020001" # tcp_client.sendall(dataSwitch(inputPort2)) # if tcp_client.recv(buffer_size)[-1]: # print('收到服务端第2个输入端口的消息') # # inputPort3 = "010200000006010200030001" # tcp_client.sendall(dataSwitch(inputPort3)) # if tcp_client.recv(buffer_size)[-1]: # print('收到服务端第3个输入端口的消息') # # inputPort4 = "010200000006010200040001" # tcp_client.sendall(dataSwitch(inputPort4)) # if tcp_client.recv(buffer_size)[-1]: # print('收到服务端第4个输入端口的消息') # # inputPort5 = "010200000006010200050001" # tcp_client.sendall(dataSwitch(inputPort5)) # if tcp_client.recv(buffer_size)[-1]: # print('收到服务端第5个输入端口的消息') # # inputPort6 = "010200000006010200060001" # tcp_client.sendall(dataSwitch(inputPort6)) # if tcp_client.recv(buffer_size)[-1]: # print('收到服务端第6个输入端口的消息') # # inputPort7 = "010200000006010200070001" # tcp_client.sendall(dataSwitch(inputPort7)) # if tcp_client.recv(buffer_size)[-1]: # print('收到服务端第7个输入端口的消息') ### 输出D0 while True: DO = input("请输入打开的输出端口(如0、1、2、3、4、5、6、7):") IfAble = input("请输入输出端口是否使能(1、使能,0、关闭):") ": IfAble = "FF" ": IfAble = " # 01 02 00 00 00 06 01 05 00 00 FF 00 data = "0102000000060105000{}{}00".format(DO,IfAble) print(dataSwitch(data)) tcp_client.sendall(dataSwitch(data)) print("已发送消息") inputPort0 = " tcp_client.sendall(dataSwitch(inputPort0)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第0个输入端口的消息') inputPort1 = " tcp_client.sendall(dataSwitch(inputPort1)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第1个输入端口的消息') inputPort2 = " tcp_client.sendall(dataSwitch(inputPort2)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第2个输入端口的消息') inputPort3 = " tcp_client.sendall(dataSwitch(inputPort3)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第3个输入端口的消息') inputPort4 = " tcp_client.sendall(dataSwitch(inputPort4)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第4个输入端口的消息') inputPort5 = " tcp_client.sendall(dataSwitch(inputPort5)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第5个输入端口的消息') inputPort6 = " tcp_client.sendall(dataSwitch(inputPort6)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第6个输入端口的消息') inputPort7 = " tcp_client.sendall(dataSwitch(inputPort7)) if tcp_client.recv(buffer_size)[-1]: print('收到服务端第7个输入端口的消息') tcp_client.close()
测试软件下载地址:
https://pan.baidu.com/s/15R57mskaKzRowtYNq2WjNQ
【微语】You only get one life,it's actually your duty to live it as fully as possible
生命只有一次,你有责任让它活出精彩