OMRONのCX-Compoletでは、PLC変数の変化をイベントとして受け取ることができます。 本記事ではVariableCompoletを使用して、PLC変数の変化をC#アプリケーションへ通知する方法を解説します。
PLCのデータを取得するタイミングをPLC側で制御したいときなどは、SysmacGatewayで変数の変化を感知することができます
CompoletはSysmacGatewayから変化したことをイベントで受け取ることができます
PLCの変数とSysmacGatewayのタグをタグデータリンクの設定が必要です(NetworkConfiguratorでタグデータリンクを設定します)
フォームにはVariableCompoletをVariableCompolet1というインスタンス名で貼って置きます
VariableCompoletはSysmacGatewayを操作するコンポーネントで、SysmacGatewayのメモリの値が変化することでイベントが起きます

以下サンプルコードはC#で書いてあります
フォームの作成(ボタンの配置など)は省略しているので適宜ボタンなどは配置してください
button7をクリックして、ActiveプロパティをTrueにした後に、Windowsのハンドルとイベントを起こす変数をセットします
変数は「aaaa」という名前のBOOL型の変数がPLCにあるとします
private void button7_Click(object sender, EventArgs e)
{
try
{
variableCompolet1.Active = true;
variableCompolet1.WindowHandle = this.Handle;
variableCompolet1.SetEvent("aaaa", 1);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
variableCompolet1.Active = true;
variableCompolet1.WindowHandle = this.Handle;
variableCompolet1.SetEvent("aaaa", 1);
5行目 ActiveをTrueにしてコンポーネントを有効にします
6行目 アプリケーションのハンドル(this.Handle)をCompoletのWindowHandleにセットします
7行目 変数名aaaaのイベントIDを1にセットします
variableCompolet1のChangedイベントにvariableCompolet1_Changedを生成します
上記SetEventをセットした変数が変化するとvariableCompolet1_Changedが実行されます
private void variableCompolet1_Changed(object sender, EventArgs e)
{
int eventID;
string variableName;
try
{
variableCompolet1.ReceiveEvent(out variableName, out eventID, 0);
object ret = variableCompolet1.ReadVariable(variableName);
Console.WriteLine(variableName + " = " + ret.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
private void variableCompolet1_Changed(object sender, EventArgs e)
SetEvent("aaaa", 1)でセットした変数aaaaが変化したらChangedイベントが発生します
variableCompolet1.ReceiveEvent(out variableName, out eventID, 0);
object ret = variableCompolet1.ReadVariable(variableName);
8行目 ReceiveEventで変化した変数名とイベントIDを取得します
9行目 ReadVariableで取得した変数名の値を読み出します
ヘルプにはWindowsメッセージでは複数のイベントが同時に上がる場合、イベントがまとめられることがあるとの記載があります
詳しくはVariableCompoletのChangedイベントのヘルプを見てください