XScript 매뉴얼 · Chapter 16
title: "COMMUNICATION — 통신 (TCP / Serial / HTTP)" chapter: 16
COMMUNICATION — 통신 채널 제어
COM["이름"] 으로 Communication Editor 에 등록된 통신 채널(TCP Server/Client,
Serial, Modbus, MES, AWS S3 등)에 접근합니다. 이벤트 함수로 비동기 수신/연결
이벤트를 받고, WriteStr 또는 SendCustomData 로 송신합니다.
기본 예제
// 수신 이벤트 연결
COM["MES"].LinkModuleName = "MES";
COM["MES"].LinkFunctionName = "OnReceiveFromServer";
// 연결 이벤트 연결
COM["MES"].ConnectedLinkModuleName = "MES";
COM["MES"].ConnectedLinkFunctionName = "OnConnected";
FUNCTION OnReceiveFromServer(string data)
{
Log("READ: '{0}'", data);
array items = STR.ParseCommaString(data);
for (i, 0, items.Count - 1)
{
string line = items[i];
if (line == "")
{
continue;
}
array pair = STR.ParseSplitString(line, ":");
string name = pair[0];
string value = pair[1];
if (TodoSomething(name, value) == false)
{
continue;
}
}
return true;
}
FUNCTION SendToServer(string data)
{
if (COM["MES"].WriteStr(data) == false)
{
return false;
}
return true;
}실전 예제 — TCP 클라이언트 프레임 송수신
STX/ETX 가 붙은 길이+유닛 번호 프레임을 구성해 송신하고, 응답을 파싱 후 타임아웃 대기.
FUNCTION Send(int unit, string cmd, string data, bool wait)
{
if (COM["Cube"].IsOpen() == false)
{
return false;
}
int unit_no = Common::GetUnitNo(unit);
ResponseOk = false;
string sendData;
if (STR.IsNullOrWhiteSpace(data))
{
sendData = MakeSendData(unit_no, cmd);
}
else
{
sendData = MakeSendData(unit_no, cmd + "," + data);
}
LastCommand = cmd;
if (COM["Cube"].WriteStr(sendData) == false)
{
return false;
}
if (wait == false)
{
return true;
}
int start = SYS.GetTickCount();
while (true)
{
if (ResponseOk)
{
break;
}
Sleep(20);
if (SYS.GetTickCount() - start > TCP_TIMEOUT)
{
return false;
}
}
return ReplyOk;
}주요 메서드
연결 제어
| 시그니처 | 설명 |
|---|---|
bool Open(void) | 연결 시작 |
void Close(void) | 연결 종료 |
bool IsOpen(void) | 연결 상태 |
bool IsLiveConnection(void) | 라이브 체크 |
bool OpenTcpIpServer(void) / void CloseServer(void) / bool IsOpenServer(void) | 서버 모드 |
int GetCount(void) | 접속 클라이언트 수 |
송신
| 시그니처 | 설명 |
|---|---|
bool WriteStr(string data) | 문자열 송신 (프로토콜 래핑) |
bool WriteStrRaw(string data) | 원시 송신 |
bool SendCustomData(string data) | 커스텀 포맷 송신 |
bool SendCustomData(string group, string data) | 그룹 지정 송신 |
bool SendCommand(string command, string data = "") | 명령 송신 |
수신 · 파싱
| 시그니처 | 설명 |
|---|---|
string ReceiveCustomData(string option = "") | 커스텀 포맷 수신 |
bool Parse(string data) | 등록된 파서 실행 |
void SeparateData(void) | 프레임 분리 |
string GetData(string name) / bool SetData(string name, string value) | 수신 데이터 맵 |
void StartCustomReadThread(void) / void StopCustomReadThread(void) | 읽기 스레드 |
bool ReadCustom(void) | 단발 읽기 |
값 채널 (계측 장비)
| 시그니처 | 설명 |
|---|---|
bool SetValue(double value) / double GetValue(bool wait = false) | 단일 값 |
bool SetChannelValue(int channel, double value) | 채널별 값 설정 |
double GetChannelValue(int channel) | 채널 값 조회 |
bool SetChannelAll(double value) | 전 채널 |
void SetChannelMinMaxValue(int channel, double min, double max) | 채널 범위 |
기타
| 시그니처 | 설명 |
|---|---|
bool SetCustomConnectionParameters(void) | 연결 파라미터 재설정 |
void SetPort(string portName) | Serial 포트 지정 |
void IdleCheckFunc(void) | Idle 체크 콜백 |
void SendLinkTest(void) | 링크 테스트 프레임 송신 |
string GetDesc(void) / string ToString(void) | 정보 문자열 |
주요 프로퍼티
| 프로퍼티 | 타입 | 설명 |
|---|---|---|
Name / ClassName | string | 식별 |
Address / PortName / BaudRate / IsBaudRateFix | 연결 파라미터 | |
Url / AccessKey / SecretKey / Region | string | HTTP/S3 파라미터 |
OpenOnStart | bool | 시작 시 자동 오픈 |
Filter | string | 수신 필터 |
MinDataSize | int | 최소 프레임 크기 |
CurrentChannel / MaxChannel / IsChannel | 멀티채널 | |
PacketStartDelimiter / PacketEndDelimiter / DataDelimiter | string | 프레임 구분자 |
MaxValue / MinValue | int | 값 범위 |
IdleCheckTimeSec / LinkTestTimeMsec | int | 주기 |
UseDebugLog / UseLinkTest / UseIdleTimeOut / UseInternalTimer | bool | 옵션 |
OnIdle / IsLinkTestOk / ResponseOk | bool | 상태 |
이벤트 함수 규약
| 연결 필드 | 호출 시점 |
|---|---|
LinkModuleName + LinkFunctionName | 데이터 수신 |
ConnectedLinkModuleName + ConnectedLinkFunctionName | 연결 상태 변화 |
OnParseFunctionName | 커스텀 파서 |
팁
- 수신 콜백은 통신 스레드에서 호출 — UI 업데이트는 반드시 디스패처를 통해.
- 타임아웃 없는
while대기는 금물 →SYS.GetTickCount()로 elapsed 관리. - 바이너리 프로토콜은
WriteStrRaw+PacketStartDelimiter/EndDelimiter조합이 안정적. - 서버 API 호출은
SYS.SendHttpGet/Post/Delete헬퍼를 우선 사용 (SYS.HTTP_ERROR_STR리턴값 체크).