从http://www.modbusdriver.com/diagslave.html下载 Modbus从站模拟器。
使用 -p 参数从控制台运行程序:
。/diagslave -p
是Modbus Slave服务器将在其中运行的端口。对于Modbus协议,默认情况下为502,但是您可以使用其他协议。
在Linux以下1024端口中,常规用户(不是root特权)运行的程序无法使用。
记住您正在使用的端口。
步骤2:准备将计算机连接到设备
您将需要一些程序以便与设备建立连接并向其发送文件。
apt-get install python3
apt-get install python3-dev
curl “https://bootstrap.pypa.io/get-pip.py” -o “get-pip.py”
python3 get-pip.py
安装picocom:
apt-get install picocom
需要此程序才能连接到设备并在设备上执行命令。
安装mpfshell:
pip install mpfshell
此程序允许您发送文件添加到设备。
您也可以从源代码安装它。请参阅此页面:https://github.com/wendlers/mpfshell
步骤3:准备设备并连接到设备
要将 Moduino 或 Pycom 设备连接到PC,您需要 RS-232/RS-485端口或转换器。检查设备的版本(使用的端口类型)并找到合适的端口或转换器。
将设备连接到PC
然后将电源连接到其上
将设备连接到PC,然后将电源连接到PC。您还可以将以太网电缆连接到Moduino ESP32(如果具有该端口)。
连接应与上面的照片类似。
查找端口的路径,用于设备连接。例如: /dev/ttyS1 , /dev/ttyUSB0 》。
对于USB转换器,路径将包含 USB 字。
您可以使用picocom程序连接到设备:
picocom /dev/ttyUSB0 -b 115200
设备的命令提示符类似于以下图像之一。
Moduino ESP32:请参阅此处
Moduino Pycom:请参见此处
第4步:上传Modbus主库
https://github.com。 com/pycom/pycom-modbus/要与Modbus从站通信,您需要适当的库。 Pycom的库与Moduino不兼容。检查符合您设备的说明。
在发送文件之前关闭picocom :按 Ctrl + A ,然后按 Ctrl + X 键。
uModBus 库,用于 Moduino ESP32 ,该库基于Moduino Pycom的pycom-modbus库。修改为可在常规ESP32设备上使用。它还为连接器类提供了其他 close() 方法。
1)Moduino ESP32
从https://github.com/techbase123/micropython-modbus下载库。解压缩存档并将所有4个文件发送到Moduino设备。
使用 mpfshell 上传它们。在带有该文件的目录中运行该程序。
通过执行以下命令连接到设备: THIS
ttyUSB0 是串行端口的名称,其中设备已连接。
使用以下命令将目录更改为 /flash/lib :
cd /flash/lib
放入所有文件使用以下命令:
put uModBusConst.py
put uModBusFunctions.py
put uModBusTCP.py
put uModBusSerial.py
示例
然后使用 exit 命令退出控制台并使用 重置 按钮重新启动设备。
2)Moduino Pycom
从以下位置下载库https://github.com/pycom/pycom-modbus/。解压缩存档并将uModbus目录的内容发送到设备。使用mpfshell上载它们。在带有该文件的目录中运行该程序。
通过执行以下命令连接到设备:
open ttyUSB0
ttyUSB0 是连接设备的串行端口的名称。
将目录更改为 /flash/lib ,创建uModbus目录并使用以下命令输入:
cd /flash/lib
md uModbus
cd uModbus
使用以下命令放入所有文件:
put const.py
put functions.py
put tcp.py
put serial.py
然后使用 exit 命令退出控制台,并通过 重置 重启设备strong》按钮。
示例
第5步:连接到网络
Moduino和Pycom之间建立连接的命令有所不同。
使用picocom连接到设备以执行适当的命令。您可以通过有线或无线方式将Moduino设备连接到网络。以下示例假定您的网络具有可用的DHCP服务器。
在其他情况下,设备将无法获得IP地址。每个Moduino均提供WiFi支持。
1)并非所有设备都具有以太网端口。
1)Moduino ESP32
连接到WiFi
在设备上执行以下命令:
from netWiFi import netWiFi
wifi = netWiFi(netWiFi.WIFI_STA, ‘ESSID’, ‘PASS’)
wifi.start()
用您的WiFi网络的名称替换 ESSID ,并 PASS (带有密码)。
执行 start() 一段时间后,您应该获得
连接到以太网络
使用以太网电缆将设备连接到有线网络。
然后执行以下命令:
from netETH import netETH
eth = netETH()
eth.start()
执行 start() 一段时间后,您应该获得分配给设备的IP地址。
2)Moduino Pycom
连接到WiFi
在设备上执行以下命令:
from network import WLAN
wlan = WLAN(mode=WLAN.STA)
nets = wlan.scan()
for net in nets:
if net.ssid == ‘ESSID’:
print(‘Network found!’)
wlan.connect(net.ssid, auth=(net.sec, ‘PASS’), timeout=5000)
while not wlan.isconnected():
machine.idle()
print(‘WLAN connection succeeded!’)
break
将 ESSID 替换为您的WiFi网络的名称,并 PASS 带有密码。
步骤6:初始化与Modbus从站的通信
两个设备的Modbus主站库相似
它们的初始化方式不同。
1)在Moduino ESP32上初始化uModBus
执行:
from uModBusTCP import uModBusTCP as TCP
2)在Pycom上初始化uModBus
执行:
from uModbus.tcp import TCP
打开连接
然后通过以下方式打开连接:
modbus=TCP(‘IP’, PORT, 60)
其中:
IP-使用Modbus从站模拟器的PC的ip地址
PORT-Modbus Slave的端口
60超时
如果在执行读/写命令期间发生以下错误:示例
为 Moduino ESP32执行:
:
modbus.close()
用于 Moduino Pycom :
modbus._sock.close()
,然后重新创建连接:
modbus=TCP(‘IP’, PORT, 60)
这对于在重新创建连接之前关闭套接字很重要。
设备限制了可用数量
第7步:读取和写入寄存器
Modbus支持几种读取和写入寄存器的功能。
uModBus库具有每个函数的方法:
read_coils
read_discrete_inputs
read_holding_registers
read_input_registers
write_single_coil
write_single_register
首先,让我们写一些值。
1)写线圈(func:5 )
在从站1中将1的值写入200寄存器中。
modbus.write_single_coil(1, 200, 0xFF00)
在我们的示例1中,第一个参数是从站ID。
第二个是寄存器号,第三个是值。对于1,您必须在此处放置 0xFF00 。从从站1将0写入201寄存器:
modbus.write_single_coil(1, 201, 0)
此方法仅允许写入布尔值:0或1。
2)写入寄存器(函数: 6)
现在将一些整数值写入几个寄存器。
从从站1将有符号的111值写入寄存器100:
modbus.write_single_register(1, 100, 111, True)
第一个参数是从设备ID,第二个寄存器号,第三个是新值。
最后一个参数定义是否应将值设置为有符号数。其默认值为True。
从从站1将带符号的-457值写入101寄存器:
modbus.write_single_register(1, 101, -457)
从从站将未签名的50值写入100寄存器3:
modbus.write_single_register(3, 100, 50, False)
此方法允许将整数值写入单个寄存器。
单个寄存器可以包含16位值。
方法返回 True 是有效的输入值,而 False 是无效的值。即使无效(对于寄存器来说太大),也会写入值
3)读取线圈/离散输入
现在可以读取写入的布尔值。要读取具有功能1的寄存器,请读取 线圈 ,执行:
modbus.read_coils(slaveId, register, count)[0:count]
要读取具有功能1的寄存器,请读取 离散输入 ,执行:
modbus.read_discrete_inputs(slaveId, register, count)[0:count]
其中:
slave-id-虚拟奴隶的ID(奴隶模拟器接受所有有效ID)
寄存器-读取的寄存器编号
count-待读取的寄存器数量(在两个位置都放入所需的数量)
这些方法返回具有布尔值的数组。每个值对应于每个寄存器。
需要以下片段: [0:count] ,因为此方法返回的值多于计数。它总是返回可以被8整除的值的数量。其他值是False,并且不对应于任何寄存器。
使用两种方法读取布尔值:
modbus.read_coils(1,200,2)[0:2]
modbus.read_discrete_inputs(1,200,2)[0:2]
结果将如下所示:示例
真 是指1个值, 假 设为0。
4)读取寄存器
现在从用6个函数编写的寄存器中读取值。
要读取具有功能3的寄存器 读取保持寄存器 ,请执行:
modbus.read_holding_registers(slaveId, register, count, signed=True)
要读取具有功能4的寄存器 读取输入寄存器 ,执行:
modbus.read_input_registers(slaveId, register, count, signed=True)
其中:
从站标识-虚拟从站的标识
寄存器-读取的寄存器编号
count-待读取的寄存器数量
带符号-指示是否应将读取值视为带符号的编号。默认状态:True
返回值是具有所需寄存器数量的元组。
读取先前设置的寄存器:
modbus.read_holding_registers(1,100,2,True)
modbus.read_input_registers(1,100,2,True)
modbus.read_holding_registers(3,100,1,False)
modbus.read_input_registers(3,100,1,False)
责任编辑:wv
-
编程
+关注
关注
88文章
3578浏览量
93551 -
ESP32
+关注
关注
17文章
953浏览量
17032
发布评论请先 登录
相关推荐
评论