Modbus86 Master

Modbus86 Master 能使 86Duino 模拟成 Modbus Master ,对通道上的 Slave 节点传送封包。

范例

启用 RS485 并使用 Modbus RTU 作为通讯方式的 Modbus Master 范例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

#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 范例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

#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 参考资料中的文本修改自 Arduino 参考资料,并根据 知识共享署名-相同方式共享 3.0 许可证 授权。参考资料中的代码示例已发布到公共领域。