สารบัญ:
- ขั้นตอนที่ 1: ดาวน์โหลดและเริ่ม Modbus TCP Slave Simulator
- ขั้นตอนที่ 2: เตรียมคอมพิวเตอร์ของคุณเพื่อเชื่อมต่อกับอุปกรณ์
- ขั้นตอนที่ 3: เตรียมอุปกรณ์และเชื่อมต่อกับมัน
- ขั้นตอนที่ 4: อัปโหลด Modbus Master Library
- ขั้นตอนที่ 5: เชื่อมต่อกับเครือข่าย
- ขั้นตอนที่ 6: เริ่มต้นการสื่อสารด้วย Modbus Slave
- ขั้นตอนที่ 7: อ่านและเขียนทะเบียน
วีดีโอ: ESP32 Modbus Master TCP: 7 ขั้นตอน
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ในคลาสนี้ คุณจะตั้งโปรแกรมตัวประมวลผล ESP32 ให้เป็น Modbus TCP Master
เราจะใช้อุปกรณ์สองเครื่องซึ่งมีโปรเซสเซอร์นี้: Moduino ESP32 และ Pycom อุปกรณ์ทั้งสองทำงานในสภาพแวดล้อม MicroPython Modbus Slave ของเราจะเป็นคอมพิวเตอร์พีซีที่มีซอฟต์แวร์จำลอง Modbus ทำงานอยู่
คุณจะต้องการ:
- Moduino ESP32 หรืออุปกรณ์ Moduino Pycom (ตรวจสอบเว็บไซต์นี้เพื่อค้นหาข้อมูลเพิ่มเติมเกี่ยวกับอุปกรณ์ Moduino ESP32 และสิ่งนี้เพื่อตรวจสอบอุปกรณ์ Pycom)
- พีซีพร้อมระบบปฏิบัติการลินุกซ์
- พอร์ต RS-232/RS-485 ในคอมพิวเตอร์ของคุณหรือตัวแปลง USB เป็น RS-232/RS-485
ขั้นตอนที่ 1: ดาวน์โหลดและเริ่ม Modbus TCP Slave Simulator
ดาวน์โหลด Modbus Slave Simulator จาก https://www.modbusdriver.com/diagslave.html จากนั้นเปิดไฟล์เก็บถาวรที่ดาวน์โหลดและแกะเวอร์ชันสำหรับระบบปฏิบัติการ Linux
รันโปรแกรมจากคอนโซลด้วยอาร์กิวเมนต์ -p:
./diagslave -p
เป็นพอร์ตที่เซิร์ฟเวอร์ Modbus Slave จะทำงาน สำหรับโปรโตคอล Modbus เป็นค่าเริ่มต้น 502 แต่คุณสามารถใช้อันอื่นได้
ในพอร์ต Linux ที่ต่ำกว่า 1024 ไม่สามารถใช้โดยโปรแกรมที่เรียกใช้จากผู้ใช้ทั่วไป (ไม่ใช่สิทธิ์ของรูท)
จำพอร์ตที่คุณใช้ ค่านี้จะจำเป็นในภายหลัง
ขั้นตอนที่ 2: เตรียมคอมพิวเตอร์ของคุณเพื่อเชื่อมต่อกับอุปกรณ์
คุณจะต้องใช้โปรแกรมบางโปรแกรมเพื่อเชื่อมต่อกับอุปกรณ์และส่งไฟล์ไป
ติดตั้งสภาพแวดล้อม Python และ pip (หากคุณไม่มี):
apt-get ติดตั้ง python3
apt-get ติดตั้ง python3-dev curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" python3 get-pip.py
ติดตั้ง picocom:
apt-get ติดตั้ง picocom
จำเป็นต้องใช้โปรแกรมนี้เพื่อเชื่อมต่อกับอุปกรณ์และรันคำสั่งบนเครื่อง ติดตั้ง mpfshell:
pip ติดตั้ง mpfshell
โปรแกรมนี้ให้คุณส่งไฟล์ไปยังอุปกรณ์ได้
คุณยังสามารถติดตั้งมันได้จากแหล่งที่มา อ้างถึงหน้านี้:
ขั้นตอนที่ 3: เตรียมอุปกรณ์และเชื่อมต่อกับมัน
ในการเชื่อมต่ออุปกรณ์ Moduino หรือ Pycom กับพีซี คุณต้องมีพอร์ตหรือตัวแปลง RS-232/RS-485 ตรวจสอบเวอร์ชันของอุปกรณ์ (ประเภทพอร์ตที่ใช้) และค้นหาพอร์ตหรือตัวแปลงที่เหมาะสม
- เชื่อมต่ออุปกรณ์กับพีซี
- จากนั้นต่อแหล่งจ่ายไฟเข้ากับมัน
เชื่อมต่ออุปกรณ์กับพีซีแล้วเชื่อมต่อแหล่งจ่ายไฟเข้ากับมัน คุณยังสามารถเชื่อมต่อสายเคเบิลอีเธอร์เน็ตกับ Moduino ESP32 (หากมีพอร์ตนั้น)
การเชื่อมต่อควรเหมือนในรูปด้านบน
ค้นหาเส้นทางสำหรับพอร์ตซึ่งใช้สำหรับการเชื่อมต่ออุปกรณ์ เช่น /dev/ttyS1, /dev/ttyUSB0
สำหรับตัวแปลง usb เส้นทางจะมีคำ USB
คุณสามารถเชื่อมต่อกับอุปกรณ์ด้วยโปรแกรม picocom:
picocom /dev/ttyUSB0 -b 115200
พรอมต์คำสั่งของอุปกรณ์จะคล้ายกับภาพใดภาพหนึ่งด้านล่างนี้
Moduino ESP32: ดูที่นี่
Moduino Pycom: ดูที่นี่
ขั้นตอนที่ 4: อัปโหลด Modbus Master Library
github.com/pycom/pycom-modbus/ในการสื่อสารกับ Modbus Slave คุณต้องมีห้องสมุดที่เหมาะสม ไลบรารีสำหรับ Pycom เข้ากันไม่ได้กับ Moduino ตรวจสอบคำแนะนำที่สอดคล้องกับอุปกรณ์ของคุณ
ปิด picocom ก่อนส่งไฟล์: กด Ctrl+A แล้วกด Ctrl+X
ไลบรารี uModBus สำหรับ Moduino ESP32 ใช้ไลบรารี pycom-modbus สำหรับ Moduino Pycom มีการปรับเปลี่ยนให้ทำงานบนอุปกรณ์ ESP32 ปกติ นอกจากนี้ยังมีเมธอด close() เพิ่มเติมสำหรับคลาสตัวเชื่อมต่อ
1) โมดูโน่ ESP32
ดาวน์โหลดไลบรารี่ได้จาก https://github.com/techbase123/micropython-modbus แกะไฟล์เก็บถาวรและส่งทั้ง 4 ไฟล์ไปยังอุปกรณ์ Moduino
ใช้ mpfshell เพื่ออัปโหลด เรียกใช้โปรแกรมนี้ในไดเร็กทอรีด้วยไฟล์นั้น
เชื่อมต่อกับอุปกรณ์โดยดำเนินการ: นี้
ttyUSB0 เป็นชื่อของพอร์ตอนุกรมที่อุปกรณ์เชื่อมต่ออยู่
เปลี่ยนไดเร็กทอรีเป็น /flash/lib ด้วยคำสั่ง:
cd /แฟลช/lib
ใส่ไฟล์ทั้งหมดด้วยคำสั่ง:
ใส่ uModBusConst.py
ใส่ uModBusFunctions.py ใส่ uModBusTCP.py ใส่ uModBusSerial.py
ตัวอย่าง
จากนั้นออกจากคอนโซลด้วยคำสั่ง exit และรีสตาร์ทอุปกรณ์ด้วยปุ่มรีเซ็ต
2) Moduino Pycom
ดาวน์โหลดไลบรารี่จาก https://github.com/pycom/pycom-modbus/ แกะไฟล์เก็บถาวรและส่งเนื้อหาของไดเร็กทอรี uModbus ไปยังอุปกรณ์ ใช้ mpfshell เพื่ออัปโหลด เรียกใช้โปรแกรมนี้ในไดเร็กทอรีด้วยไฟล์นั้น
เชื่อมต่อกับอุปกรณ์โดยดำเนินการ:
เปิด ttyUSB0
ttyUSB0 เป็นชื่อของพอร์ตอนุกรมที่อุปกรณ์เชื่อมต่ออยู่
เปลี่ยนไดเร็กทอรีเป็น /flash/lib สร้างไดเร็กทอรี uModbus และป้อนด้วยคำสั่ง:
cd /flash/libmd uModbus cd uModbus
ใส่ไฟล์ทั้งหมดด้วยคำสั่ง:
ใส่ const.py
ใส่ functions.py ใส่ tcp.py ใส่ serial.py
จากนั้นออกจากคอนโซลด้วยคำสั่ง exit และรีสตาร์ทอุปกรณ์ด้วยปุ่มรีเซ็ต
ตัวอย่าง
ขั้นตอนที่ 5: เชื่อมต่อกับเครือข่าย
คำสั่งในการสร้างการเชื่อมต่อระหว่าง Moduino และ Pycom ต่างกัน
เชื่อมต่อกับอุปกรณ์ด้วย picocom เพื่อรันคำสั่งที่เหมาะสม คุณสามารถเชื่อมต่ออุปกรณ์ Moduino กับเครือข่ายโดยใช้สายหรือไร้สาย ตัวอย่างต่อไปนี้จะถือว่าเครือข่ายของคุณมีเซิร์ฟเวอร์ DHCP ที่ใช้งานได้
ในอีกกรณีหนึ่ง อุปกรณ์จะไม่ได้รับที่อยู่ IP รองรับ WiFi ในทุก Moduino พอร์ตอีเทอร์เน็ตเป็นตัวเลือกและอุปกรณ์บางตัวเท่านั้นที่มี
1) โมดูโน่ ESP32
กำลังเชื่อมต่อกับ WiFi
ดำเนินการคำสั่งต่อไปนี้บนอุปกรณ์:
จากการนำเข้า netWiFi netWiFiwifi = netWiFi (netWiFi. WIFI_STA, 'ESSID', 'PASS') wifi.start ()
แทนที่ ESSID ด้วยชื่อเครือข่าย WiFi ของคุณและ PASS ด้วยรหัสผ่านของมัน
หลังจากดำเนินการ start() คุณควรได้รับที่อยู่ IP ที่กำหนดให้กับอุปกรณ์ของคุณ
การเชื่อมต่อกับเครือข่ายอีเทอร์เน็ต
เชื่อมต่ออุปกรณ์กับเครือข่ายแบบมีสายด้วยสายอีเธอร์เน็ต
จากนั้นรันคำสั่งต่อไปนี้:
จากการนำเข้า netETH netETHeth = netETH()eth.start()
หลังจากดำเนินการ start() คุณควรได้รับที่อยู่ IP ที่กำหนดให้กับอุปกรณ์ของคุณ
2) Moduino Pycom
เชื่อมต่อกับ WiFi
ดำเนินการคำสั่งต่อไปนี้บนอุปกรณ์:
จากการนำเข้าเครือข่าย WLANwlan = WLAN(mode=WLAN. STA) nets = wlan.scan() สำหรับ net ใน nets:if net.ssid == 'ESSID': print('Network found!') wlan.connect(net.ssid, auth=(net.sec, 'PASS'), timeout=5000) ในขณะที่ไม่ wlan.isconnected(): machine.idle() print('การเชื่อมต่อ WLAN สำเร็จ!') แตก
แทนที่ ESSID ด้วยชื่อเครือข่าย WiFi ของคุณและ PASS ด้วยรหัสผ่านของมัน
ขั้นตอนที่ 6: เริ่มต้นการสื่อสารด้วย Modbus Slave
ไลบรารี Modbus Master มีความคล้ายคลึงกันสำหรับทั้งสองอุปกรณ์
แตกต่างกันในการเริ่มต้น
1) เริ่มต้น uModBus บน Moduino ESP32
ดำเนินการ:
จาก uModBusTCP นำเข้า uModBusTCP เป็น TCP
2) เริ่มต้น uModBus บน Pycom
ดำเนินการ:
จาก uModbus.tcp นำเข้า TCP
เปิดการเชื่อมต่อ
จากนั้นเปิดการเชื่อมต่อกับ:
modbus=TCP('IP', PORT, 60)
ที่ไหน:
- IP - ที่อยู่ IP ของพีซีของคุณด้วย Modbus Slave Simulator
- PORT - พอร์ตของ Modbus Slave
- 60 คือหมดเวลา
หากเกิดข้อผิดพลาดต่อไปนี้ระหว่างดำเนินการอ่าน/เขียนคำสั่ง: EXAMPLE
ดำเนินการ:
สำหรับ 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 ค่าถึง 200 การลงทะเบียนจากทาส 1:
modbus.write_single_coil (1, 200, 0xFF00)
อาร์กิวเมนต์แรกสำหรับ id ทาส ในกรณีของเรา 1
ที่สองคือหมายเลขทะเบียนและนี่คือค่า สำหรับ 1 คุณต้องใส่ 0xFF00 ที่นี่ เขียน 0 ถึง 201 ลงทะเบียนจากทาส 1:
modbus.write_single_coil(1, 201, 0)
วิธีนี้อนุญาตให้เขียนเฉพาะค่าบูลีน: 0 หรือ 1
2) เขียนทะเบียน (func: 6)
ตอนนี้เขียนค่าจำนวนเต็มบางค่าลงในรีจิสเตอร์หลายตัว
เขียนค่าลงนาม 111 เพื่อลงทะเบียน 100 จากทาส 1:
modbus.write_single_register(1, 100, 111, ทรู)
อาร์กิวเมนต์แรกคือ id ทาส หมายเลขรีจิสเตอร์ที่สอง และที่สามคือค่าใหม่ อาร์กิวเมนต์สุดท้ายกำหนดว่าควรตั้งค่าเป็นตัวเลขที่มีลายเซ็นหรือไม่ ค่าเริ่มต้นสำหรับมันคือ True คุณไม่จำเป็นต้องตั้งค่า
เขียนค่าที่ลงนาม -457 เป็น 101 การลงทะเบียนจากทาส 1:
modbus.write_single_register(1, 101, -457)
เขียนไม่ได้เซ็นชื่อ 50 ค่าถึง 100 รีจิสเตอร์จากทาส 3:
modbus.write_single_register(3, 100, 50, เท็จ)
เมธอดนี้อนุญาตให้เขียนค่าจำนวนเต็มลงในรีจิสเตอร์เดียว
การลงทะเบียนเดี่ยวสามารถมีค่า 16 บิต
วิธีคืนค่า True คือค่าที่ป้อนถูกต้องและเป็นเท็จหากไม่ใช่ ค่าถูกเขียนแม้ว่าจะไม่ถูกต้อง (ใหญ่เกินไปสำหรับการลงทะเบียน)
3) อ่านคอยส์/อินพุตแบบไม่ต่อเนื่อง
ตอนนี้ให้อ่านค่าบูลีนที่เขียน หากต้องการอ่าน register ด้วยฟังก์ชัน 1 read coil ให้ดำเนินการดังนี้
modbus.read_coils(slaveId ลงทะเบียน นับ)[0:นับ]
หากต้องการอ่าน register ด้วยฟังก์ชัน 2 read discrete input ให้ดำเนินการดังนี้
modbus.read_discrete_inputs(slaveId, register, นับ)[0:count]
ที่ไหน:
- slave-id - id ของ virtual slave (ตัวจำลอง Slave ยอมรับรหัสที่ถูกต้องทั้งหมด)
- ลงทะเบียน - ลงทะเบียนหมายเลขสำหรับการอ่าน
- นับ - จำนวนรีจิสเตอร์ที่จะอ่าน (ใส่จำนวนที่ต้องการทั้งสองที่)
เมธอดเหล่านี้ส่งคืนอาร์เรย์ด้วยค่าบูลีน แต่ละค่าสอดคล้องกับการลงทะเบียนแต่ละครั้ง
แฟรกเมนต์: [0:count] จำเป็น เนื่องจากเมธอดนี้คืนค่ามากกว่าการนับ คืนค่าจำนวนค่าที่หารด้วย 8 ลงตัวเสมอ ค่าเพิ่มเติมเป็นเท็จและไม่สอดคล้องกับการลงทะเบียนใดๆ
อ่านค่าบูลีนของเราด้วยทั้งสองวิธี:
modbus.read_coils(1, 200, 2)[0:2]modbus.read_discrete_inputs(1, 200, 2)[0:2]
ผลลัพธ์จะเป็นดังนี้: EXAMPLE
จริงหมายถึง 1 ค่า เท็จถึง 0
4) อ่านทะเบียน
ตอนนี้อ่านค่าจากการลงทะเบียนที่เขียนด้วยฟังก์ชัน 6
หากต้องการอ่าน registers ด้วยฟังก์ชัน 3 read holding registers ให้ดำเนินการดังนี้
modbus.read_holding_registers (slaveId, ลงทะเบียน, นับ, ลงนาม = True)
หากต้องการอ่าน registers ด้วยฟังก์ชัน 4 read input register ให้ดำเนินการดังนี้
modbus.read_input_registers (slaveId, ลงทะเบียน, นับ, ลงชื่อ = True)
ที่ไหน:
- รหัสทาส - รหัสของทาสเสมือน
- ลงทะเบียน - ลงทะเบียนหมายเลขสำหรับการอ่าน
- นับ - จำนวนการลงทะเบียนที่จะอ่าน
- เซ็นชื่อ - ระบุว่าค่าที่อ่านควรถือเป็นตัวเลขที่มีลายเซ็นหรือไม่ สถานะเริ่มต้น: 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, เท็จ)
ผลลัพธ์ควรมีลักษณะดังนี้: EXAMPLE
ในบทต่อไป คุณจะได้เรียนรู้วิธีสร้าง Modbus RTU Master บนอุปกรณ์ที่รองรับ ESP32