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 / ClassNamestring식별
Address / PortName / BaudRate / IsBaudRateFix연결 파라미터
Url / AccessKey / SecretKey / RegionstringHTTP/S3 파라미터
OpenOnStartbool시작 시 자동 오픈
Filterstring수신 필터
MinDataSizeint최소 프레임 크기
CurrentChannel / MaxChannel / IsChannel멀티채널
PacketStartDelimiter / PacketEndDelimiter / DataDelimiterstring프레임 구분자
MaxValue / MinValueint값 범위
IdleCheckTimeSec / LinkTestTimeMsecint주기
UseDebugLog / UseLinkTest / UseIdleTimeOut / UseInternalTimerbool옵션
OnIdle / IsLinkTestOk / ResponseOkbool상태

이벤트 함수 규약

연결 필드호출 시점
LinkModuleName + LinkFunctionName데이터 수신
ConnectedLinkModuleName + ConnectedLinkFunctionName연결 상태 변화
OnParseFunctionName커스텀 파서

  • 수신 콜백은 통신 스레드에서 호출 — UI 업데이트는 반드시 디스패처를 통해.
  • 타임아웃 없는 while 대기는 금물 → SYS.GetTickCount() 로 elapsed 관리.
  • 바이너리 프로토콜은 WriteStrRaw + PacketStartDelimiter/EndDelimiter 조합이 안정적.
  • 서버 API 호출은 SYS.SendHttpGet/Post/Delete 헬퍼를 우선 사용 (SYS.HTTP_ERROR_STR 리턴값 체크).