python 实现Modebus 通信(pyModbusTCP )

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

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

客户端(Client)


from pyModbusTCP.client import ModbusClient # Modbus TCP Client
import  time
from pyModbusTCP import utils 
import numpy as np 
import matplotlib.pyplot as plt
# TCP auto connect on modbus request, close after it
ModbusBMS = ModbusClient(host="localhost", port=502, unit_id=1, auto_open=True, auto_close=False) 
#time.sleep(5)  
vaw=1
x = 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 的方法:

  • 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)

 
import argparse
from pyModbusTCP.server import ModbusServer, DataBank
from pyModbusTCP import utils
from datetime import datetime

import numpy as np 
Fs = 8000
f = 50
x=0
coil_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()

 上面的程序都经过测试。

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 以下是使用Python编写modbus通信程序的示例: ```python # 导入模块 from modbus_tk import modbus_tcp from modbus_tk.defines import REGISTER_READ_SIZE # 定义服务器地址和端口 SERVER_ADDRESS = "127.0.0.1" SERVER_PORT = 502 # 连接到modbus服务器 master = modbus_tcp.TcpMaster(host=SERVER_ADDRESS, port=SERVER_PORT) # 读取保持寄存器中的数据 start_address = 0 num_registers = 10 data = master.execute(1, modbus_tcp READ_HOLDING_REGISTERS, start_address, num_registers) # 打印数据 for i in range(num_registers): print("Register {} : {}".format(start_address + i, data[i])) # 关闭连接 master.close() ``` 上述代码示例中,通过导入`modbus_tk`模块和定义modbus服务器的地址和端口。然后连接到modbus服务器并读取保持寄存器中的数据,最后打印数据。当读取完成后,关闭连接。 ### 回答2: 使用Python编写一个Modbus通信程序相对简单。首先,我们需要使用Python的第三方库`pyModbusTCP`来实现Modbus通信功能。可以通过以下步骤来完成: 1. 首先,需要安装`pyModbusTCP`库。可以使用以下命令来安装: ```python pip install pyModbusTCP ``` 2. 然后,在Python程序中引入`pyModbusTCP`库: ```python from pyModbusTCP.client import ModbusClient ``` 3. 创建一个Modbus客户端对象,并与Modbus服务器建立连接: ```python c = ModbusClient() c.host('localhost') # Modbus服务器的IP地址 c.port(502) # Modbus服务器的端口号 if not c.is_open(): if not c.open(): print("无法连接到Modbus服务器") ``` 4. 进行Modbus读写操作: ```python # 读取保持寄存器中的数据 regs = c.read_holding_registers(0, 10) # 从寄存器地址0开始,读取10个寄存器的数据 if regs: print("读取到的数据:", regs) else: print("读取数据失败") # 写入数据到保持寄存器中 if c.write_single_register(0, 1234): # 将值1234写入到寄存器地址0的寄存器中 print("写入数据成功") else: print("写入数据失败") ``` 5. 最后,关闭与Modbus服务器的连接: ```python c.close() ``` 以上就是使用Python编写一个Modbus通信程序的步骤。根据实际需求,可以根据以上代码进行修改和扩展。 ### 回答3: 使用Python编写一个Modbus通信程序是相对简单的。Modbus是一种常用的串行通信协议,用于在物联网和自动化系统中传输数据。Python提供了一些库和模块,可以方便地实现Modbus通信。 首先,需要安装pyModbus库。可以使用pip命令进行安装,如下所示: ``` pip install pyModbus ``` 然后,使用以下代码片段来编写一个简单的Modbus通信程序: ```python from pymodbus.client.sync import ModbusSerialClient # 创建一个Modbus串行客户端 client = ModbusSerialClient(method='rtu', port='/dev/ttyUSB0', baudrate=9600) # 连接到Modbus串行设备 client.connect() # 读取Modbus寄存器的值 result = client.read_holding_registers(address=0, count=10, unit=1) if not result.isError(): # 打印读取的寄存器值 print(result.registers) else: # 打印错误信息 print(result) # 关闭Modbus串行客户端连接 client.close() ``` 在上面的代码中,首先创建一个Modbus串行客户端对象,并指定通信方式(RTU或ASCII)以及串口参数(如串口号和波特率)。然后使用`connect()`方法连接到Modbus串行设备。 接下来,使用`read_holding_registers()`方法读取指定地址的寄存器的值。该方法会返回一个`ModbusResponse`对象。你可以通过验证`isError()`方法的返回值来检查是否出错。如果没有出错,可以使用`registers`属性获取寄存器的值。 最后,使用`close()`方法关闭Modbus串行客户端的连接。 需要注意的是,上述代码只是简单地读取Modbus寄存器的值,实际应用中可能需要更多的操作,如读取输入寄存器、写入寄存器等。你可以根据自己的需求进行进一步的开发。 总结起来,使用Python编写Modbus通信程序只需要几行代码,通过安装pyModbus库和使用其提供的API,可以方便地实现Modbus通信功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值