[Modbus]
Modbus86 Master 能使 86Duino 模擬成 Modbus Master ,對通道上的 Slave 節點傳送封包。
範例
啟用 RS485 並使用 Modbus RTU 作為通訊方式的 Modbus Master 範例。
#include <Modbus86.h> ModbusMaster bus; ModbusMasterNode node1; ModbusMasterNode node2; int led = 0; uint32_t value = 0; void setup() { Serial485.begin(115200); /* Modbus RTU Mode via RS485. */ bus.begin(MODBUS_RTU, Serial485); /* Slave node 1 with ID 11. */ node1.attach(11, bus); /* Slave node 2 with ID 12. */ node2.attach(12, bus); } void loop() { uint16_t reg[2]; /* Write 1 coil to address 0 of the slave with ID 11. */ node1.writeSingleCoil(0, led); /* Write 2 word to holding registers address 16 of the slave with ID 11. */ reg[0] = value & 0xFFFF; reg[1] = (value >> 16) & 0xFFFF; node1.setTransmitBuffer(0, reg[0]); node1.setTransmitBuffer(1, reg[1]); node1.writeMultipleRegisters(16, 2); /* Read 2 word from holding registers address 16 of the slave with ID 11. */ node1.readHoldingRegisters(16, 2); Serial.print("From Node 1 Holding Register: "); value = node1.getResponseBuffer(0) | (node1.getResponseBuffer(1) << 16); Serial.println(value); /* Read 1 word from input registers address 2 of the slave with ID 11. */ node1.readInputRegisters(2, 1); Serial.print(" Input Register: "); Serial.print(node1.getResponseBuffer(0)); Serial.println(); /* Write 1 coil to address 0 of the slave with ID 12. */ node2.writeSingleCoil(0, led); /* Write 2 word to holding registers address 16 of the slave with ID 12. */ reg[0] = value & 0xFFFF; reg[1] = (value >> 16) & 0xFFFF; node2.setTransmitBuffer(0, reg[0]); node2.setTransmitBuffer(1, reg[1]); node2.writeMultipleRegisters(16, 2); /* Read 2 word from holding registers address 16 of the slave with ID 12. */ node2.readHoldingRegisters(16, 2); Serial.print("From Node 2 Holding Register: "); value = node2.getResponseBuffer(0) | (node2.getResponseBuffer(1) << 16); Serial.println(value); /* Read 1 word from input registers address 2 of the slave with ID 12. */ node2.readInputRegisters(2, 1); Serial.print(" Input Register: "); Serial.print(node2.getResponseBuffer(0)); Serial.println(); led = !led; value++; delay(1000); }
啟用 Ethernet 並使用 Modbus TCP 作為通訊方式的 Modbus Master 範例。
#include <Ethernet.h> #include <Modbus86.h> ModbusMaster bus; ModbusMasterNode node; byte mac[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; IPAddress localIp(192,168,1,101); IPAddress serverIp(192,168,1,102); int led = 0; uint32_t value = 0; void setup() { Ethernet.begin(mac, localIp); /* Modbus TCP Mode via Ethernet. */ bus.begin(MODBUS_TCP, serverIp); /* Slave node initialize. */ node.attach(11, bus); } void loop() { uint16_t reg[2]; /* Write 1 coil to address 0 of the slave with ID 11. */ node.writeSingleCoil(0, led); /* Write 2 word to holding registers address 16 of the slave with ID 11. */ reg[0] = value & 0xFFFF; reg[1] = (value >> 16) & 0xFFFF; node.setTransmitBuffer(0, reg[0]); node.setTransmitBuffer(1, reg[1]); node.writeMultipleRegisters(16, 2); /* Read 2 word from holding registers address 16 of the slave with ID 11. */ node.readHoldingRegisters(16, 2); Serial.print("From Node 1 Holding Register: "); value = node.getResponseBuffer(0) | (node.getResponseBuffer(1) << 16); Serial.println(value); /* Read 1 word from input registers address 2 of the slave with ID 11. */ node.readInputRegisters(2, 1); Serial.print(" Input Register: "); Serial.print(node.getResponseBuffer(0)); Serial.println(); led = !led; value++; delay(1000); }
函式庫參考主頁面
86Duino 參考的文本是根據 Creative Commons Attribution-ShareAlike 3.0 License,部分文本是從 the Arduino reference 修改的。 參考中的代碼示例已發佈到公共領域。