[OpenPLC] Modbus 아두이노 통신
0. 개요
OpenPLC 아두이노와 일반 아두이노와 Modbus 통신으로 값을 읽고 쓴다. OpenPLC 아두이노는 슬레이브(서버)로 동작하고 일반 아두이노는 마스터(클라이언트)로 동작한다.
1. 연결
OpenPLC 아두이노 핀 | 일반 아두이노 핀 |
1 (TX) | 7 |
0 (RX) | 8 |
GND | GND |
2. OpenPLC 아두이노 Modbus 설정 및 프로그램
Blink 예제를 열고 위치를 "%QX0.3"으로 세팅한다.
OpenPLC 아두이노의 물리적 핀 주소는 OpenPLC Documentation > 2.4 Physical Addressing을 참고한다.
https://autonomylogic.com/docs/2-4-physical-addressing/
2.4 Physical Addressing – Autonomy
autonomylogic.com
OpenPLC 아두이노의 Modbus 주소는 OpenPLC Documentation > 2.5 Modbus Address을 참고한다.
Transfer Program to PLC 팝업창에서 Communications를 선택한다.
- Enable Modbus RTU (Serial)을 체크한다.
- Baud를 57600으로 설정한다.
- Slave ID를 1로 설정한다.
- Save Changes 버튼을 누른다.
OpenPLC 프로그램을 아두이노에 전송한다.
이때 일반 아두이노와 연결된 핀을 빼거나, 일반 아두이노를 끄고 프로그램을 전송해야 한다.
13번핀 LED가 깜빡인다.
3. 일반 아두이노 프로그래밍
라이브러리 매니저에서 modbusmaster로 검색하여 ModbusMaster 라이브 러리를 설치한다.
#include <ModbusMaster.h>
#include <SoftwareSerial.h>
ModbusMaster node;
SoftwareSerial mySerial(7, 8); // RX, TX
void setup()
{
Serial.println("Start!!!");
Serial.begin(115200);
mySerial.begin(57600);
node.begin(1, mySerial);
Serial.println("Ready...");
}
void loop()
{
static uint32_t i;
uint8_t j, result;
uint16_t data[6];
i++;
// Discrete Output Coils
// node.writeSingleCoil(3, 1);
result = node.readCoils(0, 8);
if (result == node.ku8MBSuccess)
{
Serial.print(String(node.getResponseBuffer(0)) + " ");
}
// Discrete Input Contacts
result = node.readDiscreteInputs(0, 8);
if (result == node.ku8MBSuccess)
{
Serial.print(String(node.getResponseBuffer(0)) + " ");
}
// Analog Input Registers
result = node.readInputRegisters(0, 6);
if (result == node.ku8MBSuccess)
{
for (j = 0; j < 6; j++)
{
data[j] = node.getResponseBuffer(j);
}
Serial.print(String(data[0]) + " ");
}
// Holding Registers
// set word 0 of TX buffer to least-significant word of counter (bits 15..0)
node.setTransmitBuffer(0, lowWord(i));
// set word 1 of TX buffer to most-significant word of counter (bits 31..16)
node.setTransmitBuffer(1, highWord(i));
// slave: write TX buffer to (2) 16-bit registers starting at register 0
result = node.writeMultipleRegisters(0, 2);
// slave: read (3) 16-bit registers starting at register 2 to RX buffer
result = node.readHoldingRegisters(0, 3);
if (result == node.ku8MBSuccess)
{
for (j = 0; j < 3; j++)
{
data[j] = node.getResponseBuffer(j);
}
Serial.println(String(data[0]));
}
}
프로그램을 아두이노에 업로드한다.
4. 실행
Discrete Output Coils, Discrete Input Contacts, Analog Input Registers, Holding Registers 값이 차례로 표시된다.
Discrete Output Coils은 %QX0.3 가 켜지면 8 꺼지면 0이 반복된다.
Holding Registers는 1씩 증가한 값을 writeMultipleRegisters()를 실행하여 쓰고, readHoldingRegisters()를 실행하여 읽어온다..
오른쪽이 OpenPLC 아두이노, 왼쪽이 일반 PLC 이다.
OpenPLC 아두이노의 LED가 깜빡인다.