Serial 프로토콜을 이용한 PLCS 사용자 정의 프로토콜 사용법
Serial 프로토콜을 이용하여 PLC-S의 사용자 정의 프로토콜사용법을 알아보기로 합니다.
CICON을 통하여 PLC-S와 타사 제품의 특정 장비와 통신을 하고자 할 때 일반적인 통신이 아닌 사용자 정의 통신을 해야 합니다. 글쓴이는 타사제품이 아닌 PLC-S와 PLC-S를 통하여 사용자 정의 통신에 대한 프로그램을 만들도록 하겠습니다. (PLC-S와 타사의 특정 제품과의 사용자정의 통신도 유사한 방법으로 통신이 가능합니다.)
프로그램 방법)
사용자 정의 프로토콜을 사용하기 위해서는 Serial 프로토콜을 만든 후 프레임 및 세그먼트 생성방법에 대하여 알아야 합니다. 아래에서 자세하게 알아보도록 하겠습니다.
프로그램 생성
그림1) 프로그램 생성 초기화 화면
이 름 | 내 용 |
베이스 | 통신 카드가 장착되어 있는 베이스를 선택합니다. |
슬롯 | 통신 카드가 장착되어 있는 슬롯을 선택합니다. 슬롯은 CPU모듈이 장착된 다음 슬롯부터 슬롯번호가 정해 집니다. |
채널 | Master Slave 간의 통신 포트를 선택합니다. |
통신결과 | 송신 : SEND 명령 없이 자동 송신 주기를 설정하여 데이터를 송신하는 경우 해당 번호의 Bit에 송신 성공/실패를 나타냅니다. (통신 결과 : M0000) 송신 성공 : M0000의 프레임 번호에 해당되는 Bit를 1 Scan On 합니다. 송신 실패 : M0020의 프레임 번호에 해당되는 Bit를 1 Scan On 합니다. 수신 : 자동 송신 프레임에 대해 수신프레임이 송신에 대한 수신 프레임에 정의 되어 있으면 정의된 수신 프레임을 정상적으로 수신하였는지를 나타냅니다. (통신결과 메모리 영역 : M0000) 수신 성공 : M0000의 프레임 번호에 해당되는 Bit를 1 Scan On 합니다. 수신 실패 : M0020의 프레임 번호에 해당되는 Bit를 1 Scan On 합니다. |
번호 | 프레임 | 주기 | 송신에 대한 수신프레임 | 수신에 대한 송신프레임 | 통신결과(M0000) | |
성공시 | 실패시 | |||||
3 | 송신프레임 | 50ms | 번호 ‘4’ | - | - | - |
4 | 수신프레임 | - | - | - | M0004 | M0024 |
7 | 송신프레임 | 100ms | - | - | M0007 | M0027 |
프레임 생성
그림1) 프레임 생성 초기화 화면
이 름 | 내 용 |
프레임 이름 | 프레임 이름을 등록합니다. (최대 20자) |
통신방향 | 현재 등록하는 프레임이 송신 프레임인지 수신 프레임인지 선택합니다. |
통신주기 | PLC 프로그램에 송신 명령(SEND)없이 설정된 통신 주기가 되면 자동으로 프레임이 송신됩니다. 통신 주기가 ‘0’이면 SEND명령이 있어야만 프레임이 송신됩니다. 통신 주기를 사용하여 프레임을 송수신 하면 PLC 프로그램이 필요 없게 되므로 PLC 프로그램을 작성하여야 하는 번거로움이 없어집니다. |
송신에 대한 수신 프레임 | 통신방향이 송신프레임인 경우만 해당됩니다. 해당 프레임이 송신되고 송신에 대한 수신 프레임에 프레임이 등록되어 있다면 PLC 프로그램에 수신 명령(RECV) 없이 등록된 프레임을 수신 대기 합니다. |
수신 후 자동 송신 프레임 | 통신방향이 수신프레임인 경우만 해당되는데, 해당 프레임이 수신되면 PLC프로그램에 송신 명령 없이 등록된 송신프레임이 자동으로 송신됩니다. |
특수데이터 식별코드 사용 | 송/수신 되는 프레임의 데이터 중에서 특수 데이터를 식별해 내는 기능입니다. 송수신되는 프레임 데이터 중에 해당 식별자와 같은 문자가 있는 경우 특수데이터에 등록된 데이터가 식별문자 다음에 붙어 송수신 됩니다. 예를 들어, 식별자를 16진수 FDh로 등록하고, 특수데이터에 FFh를 등록한 경우 특수데이터는 최대 4개까지 등록할 수 있습니다. 만약 특수데이터 4개가 등록 되어있다면 식별문자 다음에 4개가 붙어 연속으로 송/수신됩니다. |
Header | Length | Cmd | MSG | Checksum |
FEh | 03h | 3Ch | 3Fh | FDh |
Header | Length | Cmd | MSG | Checksum | 특수데이터 |
FEh | 03h | 3Ch | 3Fh | FDh | FFh |
세그먼트 생성
그림1) 세그먼트 생성 초기화 화면
이 름 | 내 용 |
세그먼트 추가 | 세그먼트를 추가함으로 해서 프레임이 작성됩니다. 최대 10 개의 세그먼트를 등록할 수 있습니다. |
세그먼트 편집 | 작성된 프레임의 세그먼트들을 편집합니다. |
세그먼트 삭제 | 작성된 프레임의 세그먼트를 삭제합니다. |
위로 이동 | 작성된 프레임의 세그먼트들의 위치를 바꾸고자 할 때 사용합니다. 선택된 세그먼트를 한 칸씩 위로 이동합니다. |
아래로 이동 | 작성된 프레임의 세그먼트들의 위치를 바꾸고자 할 때 사용합니다. 선택된 세그먼트를 한 칸씩 아래로 이동합니다. |
프레임을 작성하기 위해 세그먼트를 아래그림과 같은 형식으로 추가합니다.
SEGMENT0 | SEGMENT1 | ..... | SEGMENT8 | SEGMENT9 |
세그먼트 유형
고정 값
작성하고자 하는 프레임 중 데이터의 변화가 없는 고정된 데이터를 의미합니다. ASCII또는 Binary형태로 값을 지정합니다.
데이터가 Binary형태인 경우에는 16진 숫자로 지정하며, 한 Byte의 데이터를 2자리 16진수로 지정하고, 아스키 형태인 경우에는 한 문자가 한 Byte의 데이터로 취급됩니다.
[고정값 데이터 송신]
PLC | 12345678 | 12345678 |
데이터 변환 | 바이너리 | 아스키 |
상대 기기 | 12345678 | 31 32 33 34 35 36 37 38 |
[고정값 데이터 수신]
상대 기기 | 12345678 | 31 32 33 34 35 36 37 38 |
데이터 변환 | 바이너리 | 아스키 |
PLC | 12345678 | 31 32 33 34 35 36 37 38 |
무시
수신되는 데이터의 값에 관계없이 지정된 길이만큼의 데이터를 수신 후 폐기하는 세그먼트입니다. 수신프레임에서만 설정 가능합니다.
특수데이터 식별코드 적용을 하게 되면 특수데이터의 식별자와 같은 문자가 연속해서 수신되는 것을 식별하여 식별자 다음에 오는 데이터를 무시해 버립니다.
길이가 255(bytes)로 지정이 되면 뒤 따르는 세그먼트가 수신될 때까지 길이와 관계없이 무시 처리됩니다. 따라서, 뒤 따르는 세그먼트는 반드시 고정 값 형태의 세그먼트로 정의되어야 합니다.
메모리 링크
CPU의 메모리에 저장되어 있는 데이터를 지정된 길이만큼 송신하거나, 수신된 데이터를 지정된 길이만큼 CPU메모리 영역에 저장하는 세그먼트입니다. 최대 데이터 사이즈는 250Byte 입니다.
길이가 255(bytes)로 지정이 되면 가변길이형태 세그먼트로 동작됩니다. 이 형태의 세그먼트는 프레임의 종류(송/수신)와 ASCII 변환 방식에 따라 다소의 동작 차이가 있습니다.
아래의 ASCII 데이터변환과 관련된 내용을 참조 바랍니다. 이때는 BCC 체크 즉, 오류검사 방식이 동작을 하지 않습니다. (가변 메모리 송신시 길이가 0이면 프레임 송신을 하지 않습니다.)
특수데이터 식별코드 적용을 하게 되면 특수데이터의 식별자와 같은 문자가 연속해서 수신되는 것을 식별하여 식별자 다음에 오는 데이터를 무시해 버립니다.
어드레스에는 송/수신할 데이터의 CPU메모리 영역을 지정합니다. 특수데이터 식별코드 적용됩니다.
아스키(ASCII) 데이터변환
워드 데이터 상/하위 교환을 선택하게 되면 송/수신 되는 데이터 중 상위 1Byte 데이터와 하위 1Byte 데이터를 교환합니다.
예를 들어 송신 시 CPU메모리 영역에 저장되어 있는 데이터가 h1234(ASC:1234)라 가정하고, 워드 데이터 상/하위 교환을 하면 실제 송신되는 데이터는 h3412(ASC:3421)가 되며,
수신 시 수신되는 데이터가 h1234(ASC:1234)라 가정하고, 워드 데이터 상/하위 교환을 하면 실제 수신되는 데이터 h3412(ASC:3412)가 CPU메모리에 저장됩니다.
단, 워드 메모리 데이터 송신 시 상위 바이트 저장된 데이터가 먼저 송신되며, 워드 메모리 데이터 수신 시 수신된 데이터는 상위 바이트에 먼저 저장됩니다.
[메모리 링크 데이터 수신]
상대기기 | 1234h | 31323334 | 34363630 | 1234h |
데이터 변환 | 무변환(바이너리) | 16진 정수 | 10진 정수 | 실수(스케일링:10) |
PLC | 1234h | 1234h | 1234h | B608h |
[메모리 링크 데이터 수신]
상대기기 | 1234h | 31323334 | 34363630 | 1234h |
데이터 변환 | 무변환(바이너리) | 16진 정수 | 10진 정수 | 실수(스케일링:10) |
PLC | 1234h | 1234h | 1234h | B608h |
오류검사 방식
프레임의 데이터가 올바르게 송/수신되었는지 에러검출 코드 연산을 합니다. 다양한 방식의 에러검출 코드연산을 지원합니다. 특수 데이터 식별합니다.
한 프레임에서 메모리링크를 가변길이형태 세그먼트 사용시는 동작 하지 않습니다.
SUM | 편집된 프레임을 선택된 영역 시작부터 끝까지 Binary Sum을 해서 설정 한 길이 (Byte)만큼 데이터를 송/수신합니다. 영역은 오류검사 영역(세그먼트 범위)에서 설정합니다. 아스키 데이터 변환에 관한 내용은 메모리 링크 부분을 참고바랍니다. |
SUM+MASK | 편집된 프레임을 선택된 영역 시작부터 끝까지 Binary Sum을 하고 마스킹값(FFh)으로 AND 마스킹한 데이터를 설정된 길이(Byte)만큼 송/수신합니다. 아스키 데이터 변환에 관한 내용은 메모리 링크 부분을 참고바랍니다. |
XOR | 편집된 프레임을 선택된 영역 시작부터 끝까지 Binary OR을 해서 설정된 길이(Byte) 만큼 데이터를 송/수신합니다. 아스키 데이터 변환에 관한 내용은 메모리 링크 부분을 참조하십시오. |
XOR+MASK | 편집된 프레임을 선택된 영역 시작부터 끝까지 Binary OR을 하고 마스킹값(FFFFh)으로 AND 마스킹 한 데이터를 설정된 길이(Byte)만큼 송/수신합니다. 아스키 데이터 변환에 관한 내용은 메모리 링크 부분을 참조하십시오. |
MUL | 편집된 프레임을 선택된 영역 시작부터 끝까지 Binary MUL을 하고, 설정된 데이터 길이만큼 송/수신합니다. |
MUL+MASK | 편집된 프레임을 선택된 영역 시작부터 끝까지 Binary MUL을 하고 마스킹값(FFFFh)으로 AND 마스킹한 데이터를 설정된 길이(Byte)만큼 송/수신합니다. |
CRC16 | 편집한 프레임을 선택된 영역 시작부터 끝까지 CRC16계산에 의해 나온 데이터를 설정된 길이만큼 송/수신 합니다. |
CRC16(MODBUS) | 편집한 프레임을 선택된 영역 시작부터 끝까지 CRC16 (MODBUS) 을 합니다 |
SUM의 1의 보수 | 편집된 프레임을 선택된 영역 시작부터 끝까지 Binary Sum을 하여 나온 값에 1의 보수를 취해 설정 한 길이 (Byte)만큼 데이터를 송/수신합니다. |
SUM의 2의 보수 | 편집된 프레임을 선택된 영역 시작부터 끝까지 Binary Sum을 하여 나온 값에 2의 보수를 취해 설정 한 길이 (Byte)만큼 데이터를 송/수신합니다. |
Serial 프로토콜의 전반적인 프로세스에 대하여 이해를 했다면 본격적으로 프로그램구성을 해보겠습니다.
가장 먼저 1, 2번PLC-S를 준비하고 2개의 PLC-S를 동작시키기 위하여 2개의 CICON프로그램을 실행시킵니다.
1번 PLC-S와 2번 PLC-S를 통신하기 위해서 아래의 그림과 같이 스캔프로그램과 Serial 프로토콜을 생성합니다.
Serial 프로토콜을 생성하면 다음과 같은 창을 볼 수 있습니다. 이 창에 대한 자세한 설명은 위의 설명을 참고하시기 바랍니다.
1번 PLC-S와 2번 PLC-S를 통신 시키기 위해서는 하나의 PLC-S를 베이스(로컬), 또 다른 하나의 PLC-S를 슬롯0으로 두어야 합니다.
글쓴이는 Master단을 1번 PLC-S로, Slave단을 2번 PLC-S로 선정했고 RS-232C통신을 사용하기 위하여 CH1로 설정을 해주었음을 알려드립니다.
(단, Slave단이 PLC-S가 아닌 특수카드를 사용하는 경우 슬롯1부터 시작합니다.) 또한, Serial 프로토콜의 추가버튼을 이용하여 프레임과 세그먼트를 설정합니다.
이에 대한 자세한 설명은 위의 설명을 참고하시기 바랍니다.
그림1) Serial 프로토콜 설정 초기화 화면
그림2) Serial 프로토콜 설정의 추가버튼 클릭하면 생성되는 프레임설정 초기화 화면
프레임 이름과 통신 방향을 설정한 뒤 통신주기를 설정합니다.
프레임을 무작위로 송신하는 것이 아니라 사용자가 원하는 주기로 송신하기 위해 통신 주기를 0으로 설정 후 SEND명령어를 사용한 스캔프로그램을 아래와 같이 만들었습니다.
(만약, 사용자가 원하지 않는다면 SEND명령어를 사용하지 않아도 무방 합니다.)
그림1) Master단 PLC-S의 스캔 프로그램
스캔프로그램을 작성 한 후 아래의 그림과 같이 설정합니다. 데이터 프레임은 다양한 세그먼트들로 구성되어 있습니다.
프레임 0번의 ‘TX1’은 수신단에 명령을 보내는 COMMAND [“AA”], TAIL [0D]라는 세그먼트로 구성했습니다.
이러한 세그먼트들은 SLAVE단으로 명령이 전달되었다가 SLAVE단이 수신하고 명령을 수행한 뒤 MASTER단의 RX2로 데이터가 전달됩니다.
그림1) 1번 PLC-S 의 Serial프로트콜 프로그램 프레임
그림2) 2번 PLC-S 의 Serial프로트콜 프로그램 프레임
MASTER단의 스캔프로그램과 Serial 프로토콜 설정을 마친 후SLAVE단으로 넘어와 스캔 프로그램을 만들어줍니다.
(다음과 같이 D10 ~ D17번 영역에 1초 주기로 값이 1씩 증가하는 스캔 프로그램을 만들었습니다.)
Slave단의 스캔프로그램을 만든 후 Serial 프로토콜을 설정해 보도록 하겠습니다.
Slave단의 Serial 프로토콜은 Master단의 송신 프레임이 Slave단을 거쳐 다시 Master단으로 돌아가는 프로그램을 원하기 때문에
아래의 그림과 같이 Master에서 했던 설정과 같은 형식으로 프로그램을 설정했습니다.
(사용자, 프로그램 특성에 따라 Master와 Slave단의 설정이 같지 않을 수 있음을 알려드립니다.)
Slave단의 RX1프레임은 MASTER로부터 수신한 명령을 변환 후 다시 MASTER단으로 송신할 프레임을 선정해주기 위하여 수신 후 자동 송신 프레임설정 창을 통하여 TX2를 선택해줍니다.
MASTER단의 TX1, TX3 프레임이 SEND명령어를 통해 SLAVE단으로 명령어가 전송이 되고 SLAVE단에서 받은 명령어를 수행한 후 TX2, TX4 프레임이 MASTER단의 RX2, RX4로 송신되어 데이터 값을 확인 할 수 있습니다.
메모리 모니터를 통해 결과 값에 대하여 확인해 보겠습니다.
먼저 1번 PLC-S에서 MASTER단에서 작성한 설정과 스캔프로그램을 다운로드 한 후 메모리모니터를 하면 D영역에서 어떠한 값의 변화도 찾아 볼 수 없습니다.
그 이유는 MASTER단에서 명령어를 보내기만 했지 아직 보낸 명령어에 대한 답변을 받지 않았기 때문입니다.
이제 2번 PLC-S에서 SLAVE단 설정과 스캔프로그램을 다운로드 합니다. 앞서 Slave단에서 작성했던 스캔 프로그램 때문에 1초에 1씩 증가하는 데이터를 D10 ~ D70영역에 가져오는 것을 확인 할 수 있습니다.
그림1) 2번 PLC-S의 메모리 모니터 결과
위의 과정을 마쳤으면 1번 PLC-S로 넘어가서 다운로드를 하는 것 이 아니라 ‘접속’만(상호 간 통신작업이 잘 되고 있는지 확인하기 위한 작업) 해줍니다.
2번 PLC-S의 1초에 1씩 증가하는 데이터 값이 1번 PLC-S에 들어가 이미 설정해두었던 영역에 값이 들어가는 사실을 확인 할 수 있습니다.
(그림 1번은 프로그램이 동작한지 6초만에 Capture 했기 때문에 숫자 6으로 표시되고 그림2번은 47초가 지났기 때문에 숫자 47로 표시가 되어있습니다.)
그림2) 1번 PLC-S에 접속되어 2번 PLC-S의 데이터 값이 전송되고 있는 1번 PLC-S의 메모리 모니터
주의 사항
Serial 프로토콜에서 세그먼트는 최대 10개, 프레임 개수는 최대 32개까지 가능합니다.
세그먼트를 10개 이상 등록한다면 다음과 같은 에러 메시지를 볼 수 있습니다.
그림1) 세그먼트 초과 등록에 대한 에러 메시지