從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文章
3596瀏覽量
93610 -
ESP32
+關注
關注
18文章
960瀏覽量
17114
發布評論請先 登錄
相關推薦
評論