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

生命只有一次,你有责任让它活出精彩

最新文章

  1. 解决python编码格式错误问题
  2. MD5和Base64介绍与应用
  3. Android 应用框架 —— 组件
  4. messageBox以及新窗体的使用
  5. 360回归A股,周鸿祎来给BAT和小米添堵了
  6. MCMC(四)Gibbs采样
  7. Java 最常用类(前100名)来自一万个开源项目
  8. codechef Dynamic GCD [树链剖分 gcd]
  9. java--- 使用interrupte中断线程的真正用途
  10. Sec site list
  11. C#创建 WebApi 项目
  12. 十一、eclipse如何创建一个maven工程project
  13. 「Android」 基于Binder通信的C/S架构体系认知
  14. Linux查找当前目录5天的文件并打包
  15. ACM找bug方案
  16. Git中设置代理和取消代理
  17. C#查找字符串位置
  18. JavaScript try...catch用法
  19. leetcode 202. 快乐数 python实现
  20. WCF(四) 绑定

热门文章

  1. git命令之git clone用法
  2. 使用Delve进行Golang代码的调试
  3. React Native 进的第一个坑
  4. openCV函数
  5. RDP 数据库简介
  6. ElasticSearch在linux上的安装部署全程记录
  7. sublime text plugins
  8. [Math] Unconstrained & Constrained Optimization
  9. [Tensorflow] RNN - 02. Movie Review Sentiment Prediction with LSTM
  10. [PyData] 03 - Data Representation