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

[ C# ] LS 산전 PLC 이더넷 통신하기 - 연속 읽기

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

앞서 만든 헤드 프레임 뒤에 전송 명령용 프레임 명령을 만들어야 합니다.

읽기 명령은 두 가지 방법이 있는데 개별과 연속의 차이는

  • 개별은 여려 변수를 변경하면서 읽을 수 있고

읽을 데이터의 분포가 크고 데이터의 주소가 다른 경우에 유용

  • 연속은 시작 번지를 지정하고 읽을 개수를 입력하면 연속으로 읽어 올 수 있습니다.

읽을 데이터의 량이 많고 번지가 고정인 경우 유용
일반적으로 한 개씩 읽는 개별 방식을 선호 하지만 데이터의 개수가 많았지만 통신도 많이 해야 되어 속도가 느려지는 단점이 있어 연속으로 바이트 형을 읽은 후 버퍼에 저장해두었다고 비트/워드/더블 워드로 형 변환해서 사용하게 되면 한 번의 통신으로 여러 정보를 한 번에 확인할 수 있습니다.

연속 읽기 명령 확인

고정되는 부분만 적색으로 표시하고 함수를 구현하는 법을 알아보겠습니다.

  • 명령어(2) : 0x0054
  • 데이터 타입(2) : 0x0014
  • 예약 영역(2) : 0x0000
  • 변수 개수(블록수) : 시작 번지를 기준으로 계속 읽을 것이며 블록이 여러 개이면 데이터를 읽은 후 분리가 어려워 고정으로 쓰는 방법이 좋습니다. 0x001
  • 변수 길이 : 뒤에 읽을 변수 명에 대하여 직접 변수 명의 길이 ( % MB00 이면 5자리)
  • 데이터 개수 : 최대 1,400 바이트까지 읽을 수 있음

프로그램으로 구현

먼저 바이트 배열들에 명령들을 입력하여 생성한 후 헤더 생성 함수에 값을 넣어 명령어를 만들면 됩니다.
szDevice에 읽을 시작 위치명을 입력합니다.(바이트 만 가능)

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
void RegisterRead(string szDevice)
{
    if (string.IsNullOrEmpty(szDevice)) 
    {
        return
    }
 
    int nCnt = 0
    char[] bufBody = new char[255];
 
    Array.Clear(bufBody, 0, bufBody.Length); //명령어(2) //[ h5400 읽기][ h5800 쓰기 ]
    bufBody[nCnt++= (char)0x54;
    bufBody[nCnt++= (char)0x00//데이터 타입(2) //[ h00 비트 ][ h01 바이트 ][ h02 워드 ][ h03 더블워드 ][ h04 롱워드][ h14 연속]
    bufBody[nCnt++= (char)0x14;
    bufBody[nCnt++= (char)0x00//예약 영역(2) : 0x0000 : Don’t Care.
    bufBody[nCnt++= (char)0x00;
    bufBody[nCnt++= (char)0x00//블록수(2) : 읽고자 하는 블록의 개수. 0x0001
    bufBody[nCnt++= (char)0x01;
    bufBody[nCnt++= (char)0x00//변수명 길이(2) : 최대 16자.
    bufBody[nCnt++= (char)szDevice.Length;
    bufBody[nCnt++= (char)0x00//데이터 주소 최대 16자
           
        char[] ch = szDevice.ToCharArray(); 
    for (int i = 0; i < ch.Length; i++)
    { 
        bufBody[nCnt++= ch[i];
    } //데이터 개수(2) 최대 1400byte
              
    int nLength = 256*2;
    bufBody[nCnt++= (char)(nLength & 0xFF); // Data length(L)
    bufBody[nCnt++= (char)(nLength >> 8); // Data length(H) // 앞에서 만든 명령 프레임과 헤더프레임 더하기
            
    _LS_FENET_HRADER ls_Header = new _LS_FENET_HRADER();
    char[] reData = ls_Header.Copy(nCnt, bufBody); 
            
    //** reData를 이더넷 통신으로 전송 ** 
            
}
cs

데이터 수신 부분은 읽기/쓰기 모두 공통적인 부분이 있어 이후 포스팅에서 연결해서 공유 예정입니다.

2021.12.07 - [프로그래밍/하드웨어] - LS 산전 PLC 이더넷 통신-헤더 프레임 만들기

 

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

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

jeong-f.tistory.com

 

반응형

댓글