MODBUS 프로토콜에 대한 자세한 내용을 찾아 잘 살펴보세요. 통신 계약에 명시된 형식에 따라 통신하면 됩니다.
문의한 당사자에게 계약서가 전송됩니다. Modbus 프로토콜에는 ASCII, RTU, TCP 등이 포함되며 물리적 계층을 지정하지 않습니다. 이 프로토콜은 컨트롤러가 통신하는 네트워크에 관계없이 이해하고 사용할 수 있는 메시지 구조를 정의합니다. 표준 Modicon 컨트롤러는 RS232C를 사용하여 직렬 Modbus를 구현합니다. Modbus의 ASCII 및 RTU 프로토콜은 메시지의 구조, 데이터, 명령 및 응답 방법을 규정합니다. 데이터 통신은 마스터/슬레이브 방식을 채택하며, 슬레이브는 데이터 요청 메시지를 수신한 후 마스터로 보낼 수 있습니다. 메시지. 요청에 응답하기 위해 마스터는 양방향 읽기 및 쓰기를 달성하기 위해 슬레이브의 데이터를 수정하는 메시지를 직접 보낼 수도 있습니다. Modbus 프로토콜은 패리티 확인 외에도 ASCII 모드에서는 LRC 확인을 사용하고 RTU 모드에서는 16비트 CRC를 사용합니다. 그러나 TCP 프로토콜은 Reliable Connection이므로 추가 확인이 없습니다. 지향 프로토콜. 또한 Modbus는 마스터-슬레이브 모드를 사용하여 정기적으로 데이터를 주고받습니다. 실제 사용 시 슬레이브 사이트의 연결이 끊어지면(예: 장애 또는 종료) 마스터가 이를 진단하고 장애가 복구되면 네트워크가 자동으로 다시 연결될 수 있습니다. 따라서 Modbus 프로토콜은 더 나은 신뢰성을 갖습니다. 아래에서 간단히 소개하겠습니다. Modbus의 ASCII, RTU 및 TCP 프로토콜은 TCP와 RTU 프로토콜이 매우 유사합니다. RTU 프로토콜의 2바이트 검사 코드만 제거하면 됩니다. 프로토콜 시작 부분에 5개의 0과 6을 추가하고 TCP/IP 네트워크 프로토콜을 통해 전송하면 됩니다. 그래서 여기서는 Modbus의 ASCII 및 RTU 프로토콜만 소개하겠습니다. 다음 표는 ASCII 프로토콜과 RTU 프로토콜을 비교한 것입니다. 프로토콜 시작 태그 끝 태그 확인 전송 효율성 프로그램 처리
ASCII: (콜론) CR, LF LRC 낮은 직관적, 단순, 디버깅 용이< /p>
CRC가 없는 RTU는 매우 비직관적이고 약간 복잡합니다
ASCII 프로토콜은 RTU 프로토콜에 비해 시작 및 끝 마커가 있으므로 처리가 더 편리하다는 것을 알 수 있습니다. 보이는 모든 ASCII 문자가 전송되므로 디버깅이 더 직관적이고 LRC 검증도 비교적 쉽습니다. 그러나 가시적인 ASCII 문자를 전송하기 때문에 RTU가 전송하는 데이터의 각 ASCII 바이트는 2바이트를 사용하여 전송되어야 합니다. 예를 들어 RTU가 16진수 0xF9를 전송하면 ASCII는 'F'를 전송해야 합니다. 9'는 2바이트이므로 전송 효율이 상대적으로 낮습니다. 따라서 일반적으로 전송할 데이터의 양이 적다면 ASCII 프로토콜을 사용하는 것이 좋습니다. 전송할 데이터의 양이 상대적으로 크다면 RTU 프로토콜을 사용하는 것이 가장 좋습니다.
두 프로토콜의 검증은 아래와 같습니다.
1. LRC 검사
LRC 필드는 8비트 바이너리 값을 포함하는 바이트입니다. LRC 값은 전송 장치에서 계산되어 메시지 프레임에 배치됩니다. 수신 장치는 메시지를 수신하는 과정에서 LRC를 계산하고 이를 수신된 메시지의 LRC 필드에 있는 값과 비교합니다. 같지 않아 오류가 발생했습니다.
LRC 검사는 비교적 간단하며 ASCII 프로토콜에서 사용되며 시작 부분의 콜론과 끝 부분의 캐리지 리턴 및 줄 바꿈을 제외한 메시지 필드의 내용을 감지합니다. 단지 전송해야 할 각 데이터를 바이트 단위로 겹쳐 놓은 다음 반전하고 1을 더하는 것뿐입니다.
다음은 VC 코드입니다:
BYTE GetCheckCode(const char * pSendBuf, int nEnd)//검사 코드 가져오기
{
BYTE byLrc = 0 ;
char pBuf[4];
int nData = 0
for(i=1; ilt; end; i =2) 처음에는 1, "시작 표시" 콜론을 피하세요.
{
//전송할 두 개의 ASCII 코드를 모두 16진수로 변환합니다.
pBuf [0] = pSendBuf [i];
pBuf [1] = pSendBuf [i 1]
pBuf [2] = '\0'
sscanf( pBuf, "x", & nData)
byLrc = nData
}
byLrc = ~ byLrc;
return byLrc;
}
2. CRC 확인
CRC 필드는 16비트 바이너리 값을 포함하는 2바이트입니다. . 전송 장치에서 계산되어 메시지에 추가됩니다. 수신 장치는 수신한 메시지의 CRC를 다시 계산하여 수신한 CRC 필드의 값과 비교합니다. 두 값이 다르면 오류가 발생합니다.
CRC는 먼저 값이 모두 "1"인 16비트 레지스터를 로드한 다음 메시지에서 연속된 8비트 바이트의 각 현재 레지스터 값을 처리하는 프로세스를 호출합니다. CRC에는 각 문자의 8Bit 데이터만 유효하며 시작 비트, 정지 비트 및 패리티 비트는 유효하지 않습니다.
CRC 생성 과정에서 각 8비트 문자는 레지스터의 내용과 개별적으로 OR됩니다. 결과는 최하위 비트 방향으로 이동하고 최상위 비트는 0으로 채워집니다. . LSB가 1인 경우 레지스터를 개별적으로 OR하여 LSB를 추출하고 검출합니다. LSB가 0인 경우에는 수행하지 않습니다. 전체 과정이 8번 반복됩니다. 마지막 비트(비트 8)가 완료된 후 다음 8비트 바이트는 레지스터의 현재 값과 개별적으로 OR됩니다. 최종 레지스터의 값은 메시지의 모든 바이트가 실행된 후의 CRC 값입니다.
CRC가 메시지에 추가되면 하위 바이트가 먼저 추가되고 상위 바이트가 추가됩니다. 다음은 VC 코드입니다:
WORD GetCheckCode(const char * pSendBuf, int nEnd)//체크 코드 가져오기
{
WORD wCrc = WORD (0xFFFF);
for(int i=0; ilt; nEnd; i )
{
wCrc ^= WORD(BYTE(pSendBuf[i] ));
for(int j=0; jlt; 8; j )
{
if(wCrc amp; 1)
< p>{wCrc gt;
wCrc ^= 0xA001;
{
wCrc gt;
}
}
}
return wCrc;
}
RTU 프로토콜 명령의 경우 다음 단계에 따라 간단히 ASCII 프로토콜 명령으로 변환할 수 있습니다.
1. CRC 검사가 제거되고 대신 LRC 검사가 계산됩니다.
2. 생성된 명령 문자열의 각 바이트를 해당 2바이트 ASCII 코드로 변환합니다. 예를 들어 0x03은 0x30, 0x33(ASCII 코드 0 및 ASCII 코드 3)으로 변환됩니다.
3. 명령 시작 부분에 시작 표시 ":"를 추가합니다. ASCII 코드는 0x3A입니다.
4. 명령 끝에 끝 마커 CR 및 LF(0xD, 0xA)를 추가합니다. 여기서 CR 및 LF는 캐리지 리턴 및 줄 바꿈의 ASCII 코드를 나타냅니다.
따라서 아래에서는 RTU 프로토콜만 소개합니다. 위 단계를 사용하여 해당 ASCII 프로토콜을 생성할 수 있습니다.
다음 표는 Modbus에서 지원하는 기능 코드입니다.
기능 코드 이름 기능
01 코일 상태를 읽어 그룹의 현재 상태를 얻습니다. 논리 코일(ON/OFF)
02 스위치 입력 그룹의 현재 상태를 얻기 위해 입력 상태를 읽습니다(ON/OFF)
03 유지 레지스터를 읽어서 하나 이상의 보유 레지스터의 현재 상태 이진 값
04 입력 레지스터를 읽어 하나 이상의 입력 레지스터에서 현재 이진 값을 얻습니다.
05 단일 코일을 강제로 켜십시오. -논리 코일의 꺼짐 상태
p>
06 특정 이진 값을 홀딩 레지스터에 로드하도록 단일 레지스터를 사전 설정
07 켜짐을 얻기 위해 비정상 상태를 읽습니다. -8개의 내부 코일의 꺼짐 상태. 이 8개의 코일의 주소는 서버가 결정합니다.
08 진단 검사를 다시 보내고 진단 검사 메시지를 슬레이브에 보내 통신 처리를 평가합니다.
09 프로그래밍(484에만 사용) 호스트가 프로그래밍을 시뮬레이션하도록 합니다. 컨트롤러의 기능은 PC 슬레이브 로직을 수정하는 것입니다.
10 제어 조회(484에만 사용)는 호스트가 PC 슬레이브 로직과 통신할 수 있도록 합니다. 긴 프로그램 작업을 실행 중인 슬레이브 기계에서 해당 슬레이브 기계가 작업 작업을 완료했는지 여부를 문의합니다. 이 기능 코드는 기능 코드 9가 포함된 메시지가 전송된 후에만 전송됩니다.
11 이벤트 카운트 읽기 호스트는 단일 쿼리를 발행한 다음 작업, 특히 명령이나 기타 응답의 성공 여부를 확인할 수 있습니다.
12 통신 이벤트 기록을 읽으면 호스트가 Modbus 트랜잭션을 검색할 수 있습니다. 각 슬레이브의 통신 이벤트 기록을 처리합니다.
거래가 완료되면 기록에 관련 오류가 표시됩니다.
13 프로그래밍 (184/384 484 584) 호스트 시뮬레이션 프로그래머 기능을 사용하여 PC 슬레이브 논리를 수정할 수 있습니다
14 Inquiry (184/384 484 584) 호스트가 작업을 수행하는 슬레이브와 통신할 수 있도록 하며 슬레이브가 프로그램 작업을 완료했는지 주기적으로 쿼리합니다. 이 기능 코드는 기능 13이 포함된 메시지를 보낸 후에만 전송되어야 합니다. 전송됨 < /p>
15 일련의 연속 논리 코일을 강제로 켜거나 끄도록 다중 코일 강제
16 특정 이진 값을 일련의 연속 논리 코일에 로드하도록 사전 설정된 다중 레지스터 보유 레지스터
17 슬레이브 ID를 보고하면 호스트는 주소가 지정된 슬레이브의 유형과 슬레이브의 실행 표시등 상태를 확인할 수 있습니다.
18(884 및 MICRO 84) 프로그래밍 기능을 시뮬레이션하고 PC 상태 로직을 수정하기 위한 호스트
19 통신 링크에서 수정할 수 없는 오류가 발생한 후 슬레이브는 알려진 상태로 재설정되고 시퀀스 바이트가 재설정될 수 있습니다.
20 일반 매개변수 읽기(584L) 확장 저장소 파일의 데이터 정보 표시
21 일반 매개변수 쓰기(584L) 확장 저장소 파일에 일반 매개변수를 쓰거나 수정
< p>22~64 확장을 위해 예약됨 기능 예약65~72 사용자 기능을 위해 예약됨 사용자 기능의 확장 코드를 위해 예약됨
73~119 잘못된 기능
120~127 내부 기능 사용을 위해 예약됨
128~255는 예외 응답을 위해 예약됨
이러한 기능 코드 중 더 오래 사용되는 기능 코드는 1, 2, 3, 4, 5입니다. 6. 용도 하위 컴퓨터의 디지털 및 아날로그량의 읽기 및 쓰기 동작을 구현할 수 있다.
1. 디지털 레지스터 읽기 및 쓰기(코일 상태):
컴퓨터가 명령을 보냅니다: [장치 주소] [명령 번호 01] [시작 레지스터 주소의 상위 8비트] [하위 8비트] [읽은 레지스터 수의 상위 8비트] [하위 8비트] [CRC 검사의 하위 8비트] [CRC 검사의 상위 8비트]
예: [11] [ 01][00][13][00][25][CRC 낮음][CRC 높음]
의미는 다음과 같습니다.
lt; a 485 여러 장치를 버스에 연결할 수 있으며 여기의 장치 주소는 통신하려는 장치를 나타냅니다. 예시에서는 17번(10진수 17은 16진수 11)과 통신하려고 합니다.
lt; 2gt; 명령 번호 01: 디지털 수량을 읽는 명령 번호는 01로 고정됩니다.
lt; 3gt; 시작 주소의 상위 8비트와 하위 8비트: 읽으려는 스위치 값의 시작 주소를 나타냅니다(시작 주소는 0입니다). 예를 들어, 예제의 시작 주소는 19입니다.
lt; 4gt; 레지스터 번호의 상위 8비트와 하위 8비트: 시작 주소부터 읽을 스위치 수를 나타냅니다. 이 예에는 37개의 전환 값이 있습니다.
lt; 5gt; CRC 검사: 처음부터 이전까지 검사합니다. 이 프로토콜의 마지막 부분에 소개가 있을 것입니다. 여기서 주의할 점은 명령에서 CRC 검사의 상위 및 하위 바이트 순서가 다른 순서와 반대라는 점입니다.
장치 응답: [장치 주소] [명령 번호 01] [반환된 바이트 수] [데이터 1] [데이터 2]... [데이터 n] [CRC 검사의 하위 8비트 ] [높음 8비트 CRC 검사]
예: [11][01][05][CD][6B][B2][0E][1B][CRC 낮음][CRC 높음 ]
의미는 다음과 같습니다.
lt; 장치 주소와 명령어 번호는 위와 동일합니다.
lt; 2gt; 반환된 바이트 수: 데이터의 바이트 수, 즉 데이터 1, 2...n의 n 값을 나타냅니다.
lt; Data 1...n: 각 데이터는 8비트 숫자이므로 각 데이터는 8개의 스위치 값을 나타내고 각 비트는 해당 스위치인 1을 나타냅니다. 닫혔다는 뜻이다. 예를 들면, 예시에서는 20번 스위치(색인번호는 19)가 닫혀 있고, 21번이 열려 있고, 22번이 닫혀 있고, 23번이 닫혀 있고, 24번이 열려 있고, 25번이 열려 있고, 26번이 닫혀 있고, 27번이 닫혀 있다는 뜻이다. 닫혀 있습니다... 문제의 스위치 값이 8이 정수배가 아닌 경우 마지막 바이트의 상위 부분은 의미가 없으며 0으로 설정됩니다.
lt; CRC 검사는 위와 동일합니다.
2. 읽기 전용 디지털 레지스터 읽기(입력 상태):
두 번째 바이트의 명령 번호가 더 이상 1이 아닌 2라는 점을 제외하면 코일 상태 읽기와 유사합니다.
3. 디지털 수량(코일 상태) 쓰기:
컴퓨터는 다음 명령을 보냅니다: [장치 주소] [명령 번호 05] [배치할 레지스터 주소의 상위 8비트 ] [하위 8비트] [하위 데이터의 상위 8비트] [하위 8비트] [CRC 검사의 하위 8비트] [CRC 검사의 상위 8비트]
예: [11][05] [00][AC][FF][00][CRC low][CRC high]
의미는 다음과 같습니다.
lt; 위와 같이.
lt; 2gt; 명령 번호: 디지털 수량을 쓰는 명령 번호는 05로 고정됩니다.
lt; 3gt; 낮아져야 할 레지스터 주소의 상위 8비트와 하위 8비트는 낮아져야 할 스위치의 주소를 나타냅니다.
lt; 4gt; 낮아진 데이터의 상위 8비트와 하위 8비트는 낮아져야 할 스위치의 상태를 나타냅니다. 이 예에서는 스위치가 닫혀 있습니다. [FF][00]만 닫힘을 의미하고 [00][00]은 열림을 의미하며 다른 값은 불법입니다.
lt; 이 명령은 하나의 스위치 상태만 설정할 수 있습니다.
장치 응답: 성공하면 컴퓨터에서 보낸 명령이 그대로 반환되고, 그렇지 않으면 응답하지 않습니다.
4. 아날로그 레지스터 읽기 및 쓰기(홀딩 레지스터):
컴퓨터는 다음 명령을 보냅니다: [장치 주소] [명령 번호 03] [시작 레지스터 주소의 상위 8비트] [하위 8비트] [읽은 레지스터 수의 상위 8비트] [하위 8비트] [CRC 검사의 하위 8비트] [CRC 검사의 상위 8비트]
예: [11] [ 03][00][6B][00][03][CRC low][CRC high]
의미는 다음과 같습니다.
lt; 위와 동일합니다.
lt; 2gt; 명령 번호: 아날로그 수량을 읽는 명령 번호는 03으로 고정됩니다.
lt; 3gt; 시작 주소의 상위 8비트와 하위 8비트: 읽으려는 아날로그 수량의 시작 주소를 나타냅니다(시작 주소는 0입니다). 예를 들어, 예제의 시작 주소는 107입니다.
lt; 4gt; 레지스터 번호의 상위 8비트와 하위 8비트: 시작 주소부터 몇 개의 아날로그 값을 읽어왔는지 나타냅니다. 이 예에는 3개의 아날로그 양이 있습니다. 아날로그 값은 반환된 정보에 2바이트를 반환해야 합니다.
장치 응답: [장치 주소] [명령 번호 03] [반환된 바이트 수] [데이터 1] [데이터 2]... [데이터 n] [CRC 검사의 하위 8비트 ] [높음 8비트 CRC 검사]
예: [11][03][06][02][2B][00][00][00][64][CRC 낮음] [CRC 높음]
의미는 다음과 같습니다.
lt; 장치 주소와 명령어 번호는 위와 동일합니다.
lt; 2gt; 반환된 바이트 수: 데이터의 바이트 수, 즉 데이터 1, 2...n의 n 값을 나타냅니다. 예제에서는 아날로그 수량 1개에 2바이트가 필요하므로 3개 아날로그 수량의 데이터가 반환되므로 6바이트가 됩니다.
lt; 데이터 1...n: 여기서 [data 1] [data 2]는 첫 번째 아날로그 양의 상위 8비트와 하위 8비트입니다. 두 번째 아날로그 양의 상위 8비트와 하위 8비트 등입니다. 예시에서 반환되는 값은 각각 555, 0, 100입니다.
lt; CRC 검사는 위와 동일합니다.
5. 읽기 전용 아날로그 레지스터(입력 레지스터):
두 번째 바이트의 명령 번호가 더 이상 2가 아닌 4라는 점을 제외하면 저장 레지스터를 읽는 것과 유사합니다.
6. 단일 아날로그 레지스터 쓰기(홀딩 레지스터):
컴퓨터는 다음 명령을 보냅니다: [장치 주소] [명령 번호 06] [레지스터 주소의 상위 8비트 배치] [Low 8비트] [하위 데이터의 상위 8비트] [Low 8비트] [CRC 체크의 하위 8비트] [CRC 체크의 상위 8비트]
예: [11][ 06][00][01][00][03][CRC low][CRC high]
의미는 다음과 같습니다.
lt; 위와 동일합니다.
lt; 2gt; 명령번호: 아날로그 수량을 쓰기 위한 명령번호는 06으로 고정됩니다.
lt; 3gt; 낮추어야 할 레지스터 주소의 상위 8비트와 하위 8비트: 낮춰야 할 아날로그 레지스터의 주소를 나타냅니다.
lt; 4gt; 낮아진 데이터의 상위 8비트와 하위 8비트는 낮아진 아날로그 데이터의 필요성을 나타냅니다. 예를 들어, 이 예에서는 레지스터 1의 값이 3으로 설정되어 있습니다.
lt; 5gt; 이 명령은 하나의 아날로그 수량만 설정할 수 있습니다.
장치 응답: 성공하면 컴퓨터에서 보낸 명령이 그대로 반환되고, 그렇지 않으면 응답하지 않습니다.