步驟1:下載并啟動(dòng)Modbus TCP從站模擬器
從http://www.modbusdriver.com/diagslave.html下載 Modbus從站模擬器。
然后打開用于Linux操作系統(tǒng)的下載的存檔和解壓縮版本。
使用 -p 參數(shù)從控制臺(tái)運(yùn)行程序:
。/diagslave -p
是Modbus Slave服務(wù)器將在其中運(yùn)行的端口。對(duì)于Modbus協(xié)議,默認(rèn)情況下為502,但是您可以使用其他協(xié)議。
在Linux以下1024端口中,常規(guī)用戶(不是root特權(quán))運(yùn)行的程序無(wú)法使用。
記住您正在使用的端口。
步驟2:準(zhǔn)備將計(jì)算機(jī)連接到設(shè)備
您將需要一些程序以便與設(shè)備建立連接并向其發(fā)送文件。
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
需要此程序才能連接到設(shè)備并在設(shè)備上執(zhí)行命令。
安裝mpfshell:
pip install mpfshell
此程序允許您發(fā)送文件添加到設(shè)備。
您也可以從源代碼安裝它。請(qǐng)參閱此頁(yè)面:https://github.com/wendlers/mpfshell
步驟3:準(zhǔn)備設(shè)備并連接到設(shè)備
要將 Moduino 或 Pycom 設(shè)備連接到PC,您需要 RS-232/RS-485端口或轉(zhuǎn)換器。檢查設(shè)備的版本(使用的端口類型)并找到合適的端口或轉(zhuǎn)換器。
將設(shè)備連接到PC
然后將電源連接到其上
將設(shè)備連接到PC,然后將電源連接到PC。您還可以將以太網(wǎng)電纜連接到Moduino ESP32(如果具有該端口)。
連接應(yīng)與上面的照片類似。
查找端口的路徑,用于設(shè)備連接。例如: /dev/ttyS1 , /dev/ttyUSB0 》。
對(duì)于USB轉(zhuǎn)換器,路徑將包含 USB 字。
您可以使用picocom程序連接到設(shè)備:
picocom /dev/ttyUSB0 -b 115200
設(shè)備的命令提示符類似于以下圖像之一。
Moduino ESP32:請(qǐng)參閱此處
Moduino Pycom:請(qǐng)參見此處
第4步:上傳Modbus主庫(kù)
https://github.com。 com/pycom/pycom-modbus/要與Modbus從站通信,您需要適當(dāng)?shù)膸?kù)。 Pycom的庫(kù)與Moduino不兼容。檢查符合您設(shè)備的說(shuō)明。
在發(fā)送文件之前關(guān)閉picocom :按 Ctrl + A ,然后按 Ctrl + X 鍵。
uModBus 庫(kù),用于 Moduino ESP32 ,該庫(kù)基于Moduino Pycom的pycom-modbus庫(kù)。修改為可在常規(guī)ESP32設(shè)備上使用。它還為連接器類提供了其他 close() 方法。
1)Moduino ESP32
從https://github.com/techbase123/micropython-modbus下載庫(kù)。解壓縮存檔并將所有4個(gè)文件發(fā)送到Moduino設(shè)備。
使用 mpfshell 上傳它們。在帶有該文件的目錄中運(yùn)行該程序。
通過(guò)執(zhí)行以下命令連接到設(shè)備: THIS
ttyUSB0 是串行端口的名稱,其中設(shè)備已連接。
使用以下命令將目錄更改為 /flash/lib :
cd /flash/lib
放入所有文件使用以下命令:
put uModBusConst.py
put uModBusFunctions.py
put uModBusTCP.py
put uModBusSerial.py
示例
然后使用 exit 命令退出控制臺(tái)并使用 重置 按鈕重新啟動(dòng)設(shè)備。
2)Moduino Pycom
從以下位置下載庫(kù)https://github.com/pycom/pycom-modbus/。解壓縮存檔并將uModbus目錄的內(nèi)容發(fā)送到設(shè)備。使用mpfshell上載它們。在帶有該文件的目錄中運(yùn)行該程序。
通過(guò)執(zhí)行以下命令連接到設(shè)備:
open ttyUSB0
ttyUSB0 是連接設(shè)備的串行端口的名稱。
將目錄更改為 /flash/lib ,創(chuàng)建uModbus目錄并使用以下命令輸入:
cd /flash/lib
md uModbus
cd uModbus
使用以下命令放入所有文件:
put const.py
put functions.py
put tcp.py
put serial.py
然后使用 exit 命令退出控制臺(tái),并通過(guò) 重置 重啟設(shè)備strong》按鈕。
示例
第5步:連接到網(wǎng)絡(luò)
Moduino和Pycom之間建立連接的命令有所不同。
使用picocom連接到設(shè)備以執(zhí)行適當(dāng)?shù)拿睢D梢酝ㄟ^(guò)有線或無(wú)線方式將Moduino設(shè)備連接到網(wǎng)絡(luò)。以下示例假定您的網(wǎng)絡(luò)具有可用的DHCP服務(wù)器。
在其他情況下,設(shè)備將無(wú)法獲得IP地址。每個(gè)Moduino均提供WiFi支持。
1)并非所有設(shè)備都具有以太網(wǎng)端口。
1)Moduino ESP32
連接到WiFi
在設(shè)備上執(zhí)行以下命令:
from netWiFi import netWiFi
wifi = netWiFi(netWiFi.WIFI_STA, ‘ESSID’, ‘PASS’)
wifi.start()
用您的WiFi網(wǎng)絡(luò)的名稱替換 ESSID ,并 PASS (帶有密碼)。
執(zhí)行 start() 一段時(shí)間后,您應(yīng)該獲得
連接到以太網(wǎng)絡(luò)
使用以太網(wǎng)電纜將設(shè)備連接到有線網(wǎng)絡(luò)。
然后執(zhí)行以下命令:
from netETH import netETH
eth = netETH()
eth.start()
執(zhí)行 start() 一段時(shí)間后,您應(yīng)該獲得分配給設(shè)備的IP地址。
2)Moduino Pycom
連接到WiFi
在設(shè)備上執(zhí)行以下命令:
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網(wǎng)絡(luò)的名稱,并 PASS 帶有密碼。
步驟6:初始化與Modbus從站的通信
兩個(gè)設(shè)備的Modbus主站庫(kù)相似
它們的初始化方式不同。
1)在Moduino ESP32上初始化uModBus
執(zhí)行:
from uModBusTCP import uModBusTCP as TCP
2)在Pycom上初始化uModBus
執(zhí)行:
from uModbus.tcp import TCP
打開連接
然后通過(guò)以下方式打開連接:
modbus=TCP(‘IP’, PORT, 60)
其中:
IP-使用Modbus從站模擬器的PC的ip地址
PORT-Modbus Slave的端口
60超時(shí)
如果在執(zhí)行讀/寫命令期間發(fā)生以下錯(cuò)誤:示例
為 Moduino ESP32執(zhí)行:
:
modbus.close()
用于 Moduino Pycom :
modbus._sock.close()
,然后重新創(chuàng)建連接:
modbus=TCP(‘IP’, PORT, 60)
這對(duì)于在重新創(chuàng)建連接之前關(guān)閉套接字很重要。
設(shè)備限制了可用數(shù)量
第7步:讀取和寫入寄存器
Modbus支持幾種讀取和寫入寄存器的功能。
uModBus庫(kù)具有每個(gè)函數(shù)的方法:
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中,第一個(gè)參數(shù)是從站ID。
第二個(gè)是寄存器號(hào),第三個(gè)是值。對(duì)于1,您必須在此處放置 0xFF00 。從從站1將0寫入201寄存器:
modbus.write_single_coil(1, 201, 0)
此方法僅允許寫入布爾值:0或1。
2)寫入寄存器(函數(shù): 6)
現(xiàn)在將一些整數(shù)值寫入幾個(gè)寄存器。
從從站1將有符號(hào)的111值寫入寄存器100:
modbus.write_single_register(1, 100, 111, True)
第一個(gè)參數(shù)是從設(shè)備ID,第二個(gè)寄存器號(hào),第三個(gè)是新值。
最后一個(gè)參數(shù)定義是否應(yīng)將值設(shè)置為有符號(hào)數(shù)。其默認(rèn)值為True。
從從站1將帶符號(hào)的-457值寫入101寄存器:
modbus.write_single_register(1, 101, -457)
從從站將未簽名的50值寫入100寄存器3:
modbus.write_single_register(3, 100, 50, False)
此方法允許將整數(shù)值寫入單個(gè)寄存器。
單個(gè)寄存器可以包含16位值。
方法返回 True 是有效的輸入值,而 False 是無(wú)效的值。即使無(wú)效(對(duì)于寄存器來(lái)說(shuō)太大),也會(huì)寫入值
3)讀取線圈/離散輸入
現(xiàn)在可以讀取寫入的布爾值。要讀取具有功能1的寄存器,請(qǐng)讀取 線圈 ,執(zhí)行:
modbus.read_coils(slaveId, register, count)[0:count]
要讀取具有功能1的寄存器,請(qǐng)讀取 離散輸入 ,執(zhí)行:
modbus.read_discrete_inputs(slaveId, register, count)[0:count]
其中:
slave-id-虛擬奴隸的ID(奴隸模擬器接受所有有效ID)
寄存器-讀取的寄存器編號(hào)
count-待讀取的寄存器數(shù)量(在兩個(gè)位置都放入所需的數(shù)量)
這些方法返回具有布爾值的數(shù)組。每個(gè)值對(duì)應(yīng)于每個(gè)寄存器。
需要以下片段: [0:count] ,因?yàn)榇朔椒ǚ祷氐闹刀嘤谟?jì)數(shù)。它總是返回可以被8整除的值的數(shù)量。其他值是False,并且不對(duì)應(yīng)于任何寄存器。
使用兩種方法讀取布爾值:
modbus.read_coils(1,200,2)[0:2]
modbus.read_discrete_inputs(1,200,2)[0:2]
結(jié)果將如下所示:示例
真 是指1個(gè)值, 假 設(shè)為0。
4)讀取寄存器
現(xiàn)在從用6個(gè)函數(shù)編寫的寄存器中讀取值。
要讀取具有功能3的寄存器 讀取保持寄存器 ,請(qǐng)執(zhí)行:
modbus.read_holding_registers(slaveId, register, count, signed=True)
要讀取具有功能4的寄存器 讀取輸入寄存器 ,執(zhí)行:
modbus.read_input_registers(slaveId, register, count, signed=True)
其中:
從站標(biāo)識(shí)-虛擬從站的標(biāo)識(shí)
寄存器-讀取的寄存器編號(hào)
count-待讀取的寄存器數(shù)量
帶符號(hào)-指示是否應(yīng)將讀取值視為帶符號(hào)的編號(hào)。默認(rèn)狀態(tài):True
返回值是具有所需寄存器數(shù)量的元組。
讀取先前設(shè)置的寄存器:
modbus.read_holding_registers(1,100,2,True)
modbus.read_input_registers(1,100,2,True)
modbus.read_holding_registers(3,100,1,F(xiàn)alse)
modbus.read_input_registers(3,100,1,F(xiàn)alse)
責(zé)任編輯:wv
-
編程
+關(guān)注
關(guān)注
88文章
3637瀏覽量
93901 -
ESP32
+關(guān)注
關(guān)注
18文章
977瀏覽量
17463
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論