当前位置:   article > 正文

python封装modbus-tcp协议,实现03,06,功能码

python封装modbus-tcp协议,实现03,06,功能码
  1. import socket
  2. import struct
  3. class ModbusTcp:
  4. def __init__(self,ip:str="192.168.0.20",port:int = 502):
  5. self.ip = ip
  6. self.port = port
  7. self.socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  8. self.socket.settimeout(0.5)
  9. self.isSucess = None
  10. def connect(self):
  11. try:
  12. self.socket.connect((self.ip,self.port))
  13. except:
  14. self.isSucess = False
  15. raise Exception("连接失败")
  16. else:
  17. print("连接成功")
  18. self.isSucess = True
  19. def read03FunCode(self,addr:int,numbers:int=1)->bytearray:
  20. _read_byarry = bytearray([
  21. 0x00, 0x01,
  22. 0x00, 0x00,
  23. 0x00, 0x06,
  24. 0x01,
  25. 0x03,
  26. addr>>8 & 0xff,
  27. addr&0xff,
  28. numbers>>8 & 0xff,
  29. numbers & 0xff
  30. ])
  31. if self.isSucess:
  32. try:
  33. self.socket.send(_read_byarry)
  34. except:
  35. raise Exception("读取失败")
  36. else:
  37. bytes=self.socket.recv(1024)
  38. return struct.unpack(f">{numbers}H",bytearray(bytes[9:]))
  39. def write06FunCode(self,addr, value:int):
  40. bytes = bytearray([
  41. 0x00, 0x01,
  42. 0x00, 0x00,
  43. 0x00, 0x06, # 0x06代表后面有6 个字节
  44. 0x01, # MbPA
  45. 0x06, # 代表06功能码
  46. addr>>8 & 0xff, #起始地址高字节
  47. addr & 0xff, # 起始地址低字节
  48. value>>8 & 0xdd, #写入数据高字节
  49. value & 0xff # 写入数据低字节
  50. ])
  51. self.socket.send(bytes)
  52. recv_data = self.socket.recv(12)
  53. return struct.unpack(">H",recv_data[10:12])[0]
  54. def write16Funcode(self,start_addr,values:list):
  55. length = len(values)*2+7
  56. #报文头
  57. MBAP = bytearray([
  58. 0x00,0x01,
  59. 0x00,0x00,
  60. length>>8 & 0xff, #写入的字节数量高位
  61. length & 0xff, #写入的字节数量低位
  62. 0x01 #单元标识
  63. ])
  64. PDU = bytearray(
  65. [
  66. 0x10, #功能码
  67. start_addr>>8 & 0xff, #起始地址高位字节
  68. start_addr & 0xff, #起始地址低位字节
  69. len(values)>>8 & 0xff, #写入的数量高字节
  70. len(values) & 0xff, #写入的数量低字节
  71. len(values)*2 #字节数
  72. ]
  73. )
  74. # print(pdu)
  75. for value in values:
  76. PDU.extend([(value>>8)&0xff,value & 0xff])
  77. request = MBAP+PDU
  78. if self.isSucess:
  79. self.socket.send(request)
  80. data_recv= self.socket.recv(1024)
  81. return data_recv #返回报文
  82. else:
  83. raise Exception("没有连接成功")
  84. def disConnect(self):
  85. self.socket.close()

测试正常。在写modbus协议时要注意每个功能码的格式要求是不一样的,返回的格式意义也不太一样。要注意。每个功能码发送报文和返回报文参考如下,可以按照格式自行实现功能。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号