본문 바로가기
프로그래밍/C Sharp

[ C# ] LS 산전 PLC 이더넷 통신하기-응답 데이터 분석

by jeong-f 2021. 12. 7.
반응형

PLC로부터 명령을 전송한 후 공통점을 비교하여 통신의 속도 향상을 위해 비동기적으로 처리하려고 하거나 코드의 량을 줄이기 위해 데이터 분석을 통해 데이터 처리 효율을 높일 수 있습니다.
아래 가장 많이 쓰는 읽기/ 쓰기 명령들을 비교를 먼저 해보고자 명령 내용들을 캡처해보았습니다.

직접 변수 연속 읽기 응답

직접변수 연속 읽기 응답

직접 변수 개별 쓰기 응답

직접 변수 개별 쓰기 응답

직접 변수 연속 쓰기 응답

직접변수 연속 쓰기 응답

 

정상 응답일 때 공통점

  • 헤더
  • 명령어(0x55 연속 읽기, 0x59 쓰기)
    0x55/59로 읽은 것인지 쓴 것인지를 판단
  • 데이터 타입(0x14블록 타입)
  • 예약 영역(0x00 고정)
  • 에러 상태 없으므로 0x00
  • 블록수 명령 상의 블록 보통 1개 사용
  • 읽은 데이터 개수(읽기 전송)
  • 읽은 데이터(읽기 전용)

에러 응답일 때 공통점

  • 헤더
  • 명령어(0x55 연속 읽기, 0x59 쓰기)
    0x55/59로 읽은 것인지 쓴 것인지를 판단
  • 데이터 타입(0x14블록 타입)
  • 예약 영역(0x00 고정)
  • 에러 상태 없으므로 0 xFFFF(0이 아닌 값)
  • 에러코드

위의 공통점으로 비교를 한다면 앞에서부터 에러 상태가 있는지 비교하고 있는 경우 에러코드를 확인하고
에러가 0인 경우 읽기(0X55) 인지 쓰기(0x59)인지 비교하여 쓰기 인 경우 성공, 읽기인 경우 데이터 타입을 비교 데이터 개수만큼 반복하면서 버퍼에 저장하면 됩니다.

통신 에러코드 표

코드로 보기

구조적인 부분을 보여주기 위한 예시이므로 일부분만 발취하였습니다.

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
// 읽기 응답 : 0x59
        //[ h0000 비트 ][ h0100 바이트 ][ h0200 워드 ][ h0300 더블워드 ][ h0400 롱워드][ h1400 연속]
        if (bytes[22== 0x14)
        {
            for (int i = 0; i < nData / 2 ; i++)
            {
                ushort uData = (ushort)MAKE_WORD(bytes[33 + (i * 2)], bytes[32 + (i * 2)]);
 
                if (uData != m_DataBuff[i])
                {
                    m_DataBuff[i] = uData;
                }
            }
 
            // 27= 블록 개수 , 29 = 데이터 갯수
        }
 
        //[ h0200 워드 ]
        if (bytes[22== 0x02)
        {
            for (int i = 0; i < nData / 2; i++)
            {
                ushort uData = (ushort)MAKE_WORD(bytes[33 + (i * 2)], bytes[32 + (i * 2)]);
            }
            // 27= 블록 개수 , 29 = 데이터 갯수
        }
    }
    else if (bytes[20== 0x59)
    {
        // 쓰기 응답 : 0x59
    }
}
else
{
    // 에러상태
    // 에러코드(Hex 1Byte)
 
    if (bytes[20== 0x55)
    {
    }
    else if (bytes[20== 0x59)
    {
        // 쓰기 응답 : 0x59
    }
 
    // 28번째가 에러 코드이며 에러 코드 표로 메시지를 띄움
    int nErr = bytes[28];
    ErrorMessage(nErr);
}
cs

 


공통점을 찾게 되면 읽기/쓰기를 같은 함수 내에서 처리할 수 있어 통신 추적이 용이 해지고 코드도 짧아져 관리가 편리 해질 것입니다.
2021.12.07 - [프로그래밍/하드웨어] - LS 산전 PLC 이더넷 통신-헤더 프레임 만들기

 

LS PLC 이더넷 통신-헤더 프레임 만들기

LS PLC의 데이터의 전송은 헤더 + 프레임(읽기/쓰기 명령)을 합쳐서 데이터를 전송하는 방식으로 데이터의 구조를 알아야 정상적으로 통신이 가능합니다, 읽기와 쓰기 명령에 공통적으로 들어가

jeong-f.tistory.com

2021.12.07 - [프로그래밍/하드웨어] - LS 산전 PLC 이더넷 통신하기 - 연속 읽기

 

LS 산전 PLC  이더넷 통신하기 - 연속 읽기

앞서 만든 헤드 프레임 뒤에 전송 명령용 프레임 명령을 만들어야 합니다. 읽기 명령은 두 가지 방법이 있는데 개별과 연속의 차이는 개별은 여려 변수를 변경하면서 읽을 수 있고  읽을 데이터

jeong-f.tistory.com

2021.12.07 - [프로그래밍/하드웨어] - LS 산전 PLC 이더넷 통신 - 개별 쓰기

 

LS 산전 PLC  이더넷 통신 - 개별 쓰기

데이터 쓰기 명령에는 두 가지의 방법이 있으며 데이를 읽을 목적에 따라 개별과 연속으로 사용할 수 있습니다 개별 쓰기 : 여러 타입의 변수형을 쓸 수 있으며 16개의 블록(번지)을 쓸 수 있음

jeong-f.tistory.com

 

반응형

댓글