XScript マニュアル · Chapter 16

COMMUNICATION — 通信チャネル制御

COM["名前"] で Communication Editor に登録された通信チャネル(TCP Server/Client、 Serial、Modbus、MES、AWS S3 など)へアクセスします。イベント関数で非同期の受信/接続 イベントを受け取り、WriteStr または SendCustomData で送信します。

基本例

xscript
// 受信イベントの接続
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 を付与した長さ+ユニット番号のフレームを構成して送信し、応答をパースした後 タイムアウト待機します。

xscript
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)フレーム分離
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 の戻り値をチェック)。