文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python 实现Modebus 通信(pyModbusTCP )

2023-08-30 23:22

关注

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

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

客户端(Client)

from pyModbusTCP.client import ModbusClient # Modbus TCP Clientimport  timefrom pyModbusTCP import utils import numpy as np import matplotlib.pyplot as plt# TCP auto connect on modbus request, close after itModbusBMS = ModbusClient(host="localhost", port=502, unit_id=1, auto_open=True, auto_close=False) #time.sleep(5)  vaw=1x = np.arange(0,1000,1,dtype=np.int16)y=np.arange(-10,10,0.02,dtype=np.float32)if __name__ == '__main__':    while True:        reg_l=ModbusBMS.read_input_registers(0,2)        val=utils.word_list_to_long(reg_l)        print(utils.decode_ieee(val[0],False))                y=np.append(y,utils.decode_ieee(val[0],False))        y=np.delete(y, 0, axis=0)              plt.clf()        plt.plot(x, y, ls="-", lw=2, label="plot figure")        plt.legend()        plt.show()        plt.pause(0.01)

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

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

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

服务器端(Server)

 import argparsefrom pyModbusTCP.server import ModbusServer, DataBankfrom pyModbusTCP import utilsfrom datetime import datetimeimport numpy as np Fs = 8000f = 50x=0coil_state=True class MyDataBank(DataBank):    """A custom ModbusServerDataBank for override get_holding_registers method."""    def __init__(self):        # turn off allocation of memory for standard modbus object types        # only "holding registers" space will be replaced by dynamic build values.        super().__init__(virtual_mode=True)    def get_coils(self, address, number=1, srv_info=None):        global coil_state        coil_state=not coil_state        return coil_state                def get_holding_registers(self, address, number=1, srv_info=None):        """Get virtual holding registers."""        # populate virtual registers dict with current datetime values        now = datetime.now()        return now.second           def get_input_registers(self, address, number=1, srv_info=None):        global x        wave=np.sin(2 * np.pi * f * x / Fs)*10        x=x+1        b32_l=[utils.encode_ieee(wave,False)]        b16_l = utils.long_list_to_word(b32_l)        print(b16_l)                      return  b16_l if __name__ == '__main__':    # parse args    parser = argparse.ArgumentParser()    parser.add_argument('-H', '--host', type=str, default='localhost', help='Host (default: localhost)')    parser.add_argument('-p', '--port', type=int, default=502, help='TCP port (default: 502)')    args = parser.parse_args()    # init modbus server and start it    server = ModbusServer(host=args.host, port=args.port, data_bank=MyDataBank())    server.start()

 上面的程序都经过测试。

来源地址:https://blog.csdn.net/yaojiawan/article/details/131445159

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯