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 / 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の戻り値をチェック)。