이더넷으로 XGT PLC와 통신하기
관련자료
제8장 전용통신을 참고하세요.
예제
VB6에서 소켓통신으로 데이터를 보내려면 바이트 단위로 전송해야 한다.
SendData_Hex = "4C5349532D584754" & _
"0000" & _
"0000" & _
"A0" & _
"33" & _
ByteSwap(Format$(Hex$(Invoke_ID), "0000"), sckHex) & _
ByteSwap(Format$(Hex(10 + sVarLength), "0000"), sckHex) & _
"03" & _
Format$(Hex(((Val(&H33E) + Val("&H" & Hex(Invoke_ID)))) Mod 256), "00") & _
Replace(StringToHex(setReadWrite), " ", "") & _
ByteSwap(Format$(sDataType, "0000"), sckHex) & _
"00" & "00" & _
"01" & "00" & _
ByteSwap(Format$(sDeviceLength, "0000"), sckHex) & _
Replace(StringToHex(sStartDevice), " ", "")
SendData_Ascii = HexToString(SendData_Hex)
Dim bSendData_Ascii() As Byte
bSendData_Ascii = SendData_Ascii
SCK.SendData bSendData_Ascii
Function HexToString(ByVal sText As String) As String
Dim saHex As String, i As Long
Dim cut_index As Integer
Dim sub_String As String
cut_index = 1
Do
saHex = Mid(sText, cut_index, 2)
sub_String = sub_String & ChrB("&H" & saHex)
cut_index = cut_index + 2
Loop While cut_index < Len(sText)
HexToString = sub_String
End Function
bSendData_Ascii 값은 아래 예제 코드의 헥사값을 HexToString라는 함수를 만들어 변환한 것인데 ChrB("&H" & saHex) 처럼 ChrB() 함수를 사용해야 한다는 것이 중요하다.
그 다음 Byte 형식의 배열 변수에 넣고 SendData를 하면 된다.
여기서 SCK는 WinSocket의 Name이다.
D1000번지의 16비트값을 읽는 코드
송신 데이터4C5349532D58475400000000A0330200110003405400020000000100070025445731303030
수신 데이터
4C5349532D584754000004013F02000E000324550002000201000001000200744E
헥사 분할표
헥사값은 위와 같이 송수신 할 때 스왑을 해야한다.
※ ChrB() 함수를 적용하면 위 표와 달리 문자가 깨져보인다. 위 그림은 ChrW()함수를 사용한 참고용.
송수신 결과 (프레임번호, BCC, Length 계산 참고용)4C 53 49 53 2D 58 47 54 00 00 00 00 A0 33 3F 00 10 00 00 7D 54 00 14 00 00 00 01 00 04 00 25 44 42 30 02 00
4C 53 49 53 2D 58 47 54 00 00 00 00 A0 33 40 00 10 00 00 7E 54 00 14 00 00 00 01 00 04 00 25 44 42 30 02 00
4C 53 49 53 2D 58 47 54 00 00 00 00 A0 33 41 00 10 00 00 7F 54 00 14 00 00 00 01 00 04 00 25 44 42 30 02 00
A: 송수신 데이터 매칭용으로 00 ~ FF까지 자유 설정. 1:1 통신은 00 가능- 동시에 여러개를 송수신할 때 순서가 섞일 수 있으므로 어떤 질문에 대한 답인지 알아야 하므로 Invoke ID를 설정한다.A: 헤더 길이 (Hex Sum) (1Byte) 여기까지 헤더 (00도 통신 됨)- 4C부터 00까지 모두 더한 값의 2자리값이다.A: 헤더 이후 길이 (Hex Sum)
(2Byte)
- 위 예제에서 54 부터 00까지 16개이므로 16진수로 10이다. 스왑을 했으므로 10 00이 된다.