您现在的位置是:首页 > 技术教程 正文

python 实现Modebus 通信(pyModbusTCP )

admin 阅读: 2024-03-24
后台-插件-广告管理-内容页头部广告(手机)

        尽管python 并不适合实时控制,但是它编写程序实在是太方便了。至少在程序快速成型和验证过程中可以使用Python 来实现,另一方面,Python 强大的数值计算和图形显示能力也能够实现modbus 设备的远程监控,数据采集,甚至AI 训练。Python 在算法开法,仿真等场景是高效率的编程工具。

   这里我们介绍Python 实现ModbusTCP的例子:

客户端(Client)

  1. from pyModbusTCP.client import ModbusClient # Modbus TCP Client
  2. import time
  3. from pyModbusTCP import utils
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. # TCP auto connect on modbus request, close after it
  7. ModbusBMS = ModbusClient(host="localhost", port=502, unit_id=1, auto_open=True, auto_close=False)
  8. #time.sleep(5)
  9. vaw=1
  10. x = np.arange(0,1000,1,dtype=np.int16)
  11. y=np.arange(-10,10,0.02,dtype=np.float32)
  12. if __name__ == '__main__':
  13. while True:
  14. reg_l=ModbusBMS.read_input_registers(0,2)
  15. val=utils.word_list_to_long(reg_l)
  16. print(utils.decode_ieee(val[0],False))
  17. y=np.append(y,utils.decode_ieee(val[0],False))
  18. y=np.delete(y, 0, axis=0)
  19. plt.clf()
  20. plt.plot(x, y, ls="-", lw=2, label="plot figure")
  21. plt.legend()
  22. plt.show()
  23. plt.pause(0.01)

         注意的是 auto_open和auto_close两个标记,它指明每次请求modbusTCP 时是否会自动打开和关闭TCP/IP 连接。如果auto_close=True 表示每次都会自动关闭连接,经测试,它会引起2秒中的延时。

上述例子中使用plt 显示实时数据,在这里是一sin 曲线。是np.append 和np.delete 维持一个实时数据队列。

ModbusBMS具有下列几种读取modbus 的方法:

  • ModbusBMS.read_holding_registers
  • ModbusBMS.read_input_registers
  • ModbusBMS.read_coils
  •  ModbusBMS.read_discrete_inputs
  • ModbusBMS.write_single_register
  • ModbusBMS.write_single_coil
  • ModbusBMS.write_multiple_registers
  • ModbusBMS.write_multiple_coils

服务器端(Server)

  1. import argparse
  2. from pyModbusTCP.server import ModbusServer, DataBank
  3. from pyModbusTCP import utils
  4. from datetime import datetime
  5. import numpy as np
  6. Fs = 8000
  7. f = 50
  8. x=0
  9. coil_state=True
  10. class MyDataBank(DataBank):
  11. """A custom ModbusServerDataBank for override get_holding_registers method."""
  12. def __init__(self):
  13. # turn off allocation of memory for standard modbus object types
  14. # only "holding registers" space will be replaced by dynamic build values.
  15. super().__init__(virtual_mode=True)
  16. def get_coils(self, address, number=1, srv_info=None):
  17. global coil_state
  18. coil_state=not coil_state
  19. return coil_state
  20. def get_holding_registers(self, address, number=1, srv_info=None):
  21. """Get virtual holding registers."""
  22. # populate virtual registers dict with current datetime values
  23. now = datetime.now()
  24. return now.second
  25. def get_input_registers(self, address, number=1, srv_info=None):
  26. global x
  27. wave=np.sin(2 * np.pi * f * x / Fs)*10
  28. x=x+1
  29. b32_l=[utils.encode_ieee(wave,False)]
  30. b16_l = utils.long_list_to_word(b32_l)
  31. print(b16_l)
  32. return b16_l
  33. if __name__ == '__main__':
  34. # parse args
  35. parser = argparse.ArgumentParser()
  36. parser.add_argument('-H', '--host', type=str, default='localhost', help='Host (default: localhost)')
  37. parser.add_argument('-p', '--port', type=int, default=502, help='TCP port (default: 502)')
  38. args = parser.parse_args()
  39. # init modbus server and start it
  40. server = ModbusServer(host=args.host, port=args.port, data_bank=MyDataBank())
  41. server.start()

 上面的程序都经过测试。

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索