สารบัญ:

ESP32 Modbus Master TCP: 7 ขั้นตอน
ESP32 Modbus Master TCP: 7 ขั้นตอน

วีดีโอ: ESP32 Modbus Master TCP: 7 ขั้นตอน

วีดีโอ: ESP32 Modbus Master TCP: 7 ขั้นตอน
วีดีโอ: RS485 MODBUS RTU MODBUS MASTER to ESP32 SLAVE สำหรับผู้เริ่มต้น 2024, มิถุนายน
Anonim
ESP32 Modbus Master TCP
ESP32 Modbus Master TCP

ในคลาสนี้ คุณจะตั้งโปรแกรมตัวประมวลผล 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 TCP Slave Simulator
ดาวน์โหลดและเริ่ม 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 ตรวจสอบเวอร์ชันของอุปกรณ์ (ประเภทพอร์ตที่ใช้) และค้นหาพอร์ตหรือตัวแปลงที่เหมาะสม

  1. เชื่อมต่ออุปกรณ์กับพีซี
  2. จากนั้นต่อแหล่งจ่ายไฟเข้ากับมัน

เชื่อมต่ออุปกรณ์กับพีซีแล้วเชื่อมต่อแหล่งจ่ายไฟเข้ากับมัน คุณยังสามารถเชื่อมต่อสายเคเบิลอีเธอร์เน็ตกับ Moduino ESP32 (หากมีพอร์ตนั้น)

การเชื่อมต่อควรเหมือนในรูปด้านบน

ค้นหาเส้นทางสำหรับพอร์ตซึ่งใช้สำหรับการเชื่อมต่ออุปกรณ์ เช่น /dev/ttyS1, /dev/ttyUSB0

สำหรับตัวแปลง usb เส้นทางจะมีคำ USB

คุณสามารถเชื่อมต่อกับอุปกรณ์ด้วยโปรแกรม picocom:

picocom /dev/ttyUSB0 -b 115200

พรอมต์คำสั่งของอุปกรณ์จะคล้ายกับภาพใดภาพหนึ่งด้านล่างนี้

Moduino ESP32: ดูที่นี่

Moduino Pycom: ดูที่นี่

ขั้นตอนที่ 4: อัปโหลด Modbus Master Library

อัปโหลด Modbus Master Library
อัปโหลด 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 Slave
เริ่มต้นการสื่อสารด้วย 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 มีเมธอดสำหรับแต่ละฟังก์ชัน:

  1. read_coils
  2. read_discrete_inputs
  3. read_holding_registers
  4. read_input_registers
  5. write_single_coil
  6. 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

แนะนำ: