예제를 통해서 구체적으로 어떻게 ComfileHMI와 Modular FADUINO간의 연결이 이루어지는지 살펴보겠습니다.
일단 아무것도 없는 상태의 소스에서부터 출발을 하겠습니다.
void setup() { } void loop() { }
이 상태에서 라이브러리를 추가해주세요. 그리고 링크를 위한 전역배열 (즉,링크배열) 가 필요합니다. 이 링크배열을 통해서 FADUINO와 ComfileHMI 사이의 정보를 교환할 수 있습니다.
전역배열로 선언하려면 setup이나, loop 바깥에 배열을 선언해야 합니다.
#include "CFMEGA.h" #include "cfSimpleModbusRtu.h" CFNET cfnet; uint16_t Lword[99]; // 16비트 워드값을 저장하는 링크 배열 uint8_t Lbit[99]; // 1비트 값을 저장하는 링크 배열 void setup() { } void loop() { }
밑작업은 끝났습니다. 이제 MODBUS를 시동걸어 보겠습니다. startModbusServer 함수를 setup안에 넣어주기만 하면됩니다.
#include "CFMEGA.h" #include "cfSimpleModbusRtu.h" CFNET cfnet; uint16_t Lword[99]; uint8_t Lbit[99]; void setup() { startModbusServer(2, 1, Lword, Lbit); // uartCh, ModbusSlaveAdr, WordArea, BitArea } void loop() { }
Arduino IDE에서 코딩은 이것으로 일단락 되었습니다. 이제 Comfile Studio로 넘어가보겠습니다.
ComfileHMI에 숫자 위젯 한개만 표시하고 주소는 2번지로 설정해주세요.
(부연설명) 모드버스의 주소체계는 펑션코드와 같이 기술합니다. 40002라는 주소는 펑션3번 (워드공간을 뜻함)의 주소2번이라는 뜻입니다.
그리고 다음과 같이 소스를 고치면, incvalue라는 변수에 있는 값이 계속 증가하고, 그 값은 링크배열 Lword에 저장됩니다.
#include "CFMEGA.h" #include "cfSimpleModbusRtu.h" CFNET cfnet; uint16_t incvalue; uint16_t Lword[99]; uint8_t Lbit[99]; void setup() { startModbusServer(2, 1, Lword, Lbit); // uartCh, ModbusSlaveAdr, WordArea, BitArea } void loop() { Lword[2] = incvalue++; }
실행시키면, 계속 증가되는 숫자가 ComfileHMI 화면상에 표시됩니다.
여기까지 성공하셨다면, 많은 부분을 이해하고 해결하신 상황입니다. 축하드립니다. 만약 위 예제가 제대로 동작하지 않는다면, 아래 열거된 과정중에 잘못된 부분이 있는지 점검해보시기 바랍니다.
앞서 상황은 FADUINO에서 LWORD 링크배열에 값만 써 넣었는데, ComfileHMI가 알아서 그 값을 가져간뒤 화면에 표시하는 상황입니다.
이 번에는 반대로, ComfileHMI에 있는 버튼을 눌러서 변화된 상태를 FADUINO에 포트로 출력해 보겠습니다.
제어버튼 위젯과 램프 위젯을 사용했습니다. 제어버튼 속성은 <비트주소>로 하나는 On, 다른 하나는 Off로 설정하세요
#include "CFMEGA.h" #include "cfSimpleModbusRtu.h" CFNET cfnet; uint16_t incvalue; uint16_t Lword[99]; uint8_t Lbit[99]; void setup() { pinMode(13,1); startModbusServer(2, 1, Lword, Lbit); // uartCh, ModbusSlaveAdr, WordArea, BitArea } u16 ltemp; u8 tempv; void loop() { Lword[2] = incvalue++; if (Lbit[3] == 1) { cfnet.digitalWrite(0,15,1); } // 버튼위젯 정보를 읽어서 실제로 포트를 On/Off 시키는 부분입니다. else { cfnet.digitalWrite(0,15,0); } }