私は通常、これが次の 2 つの方法で行われるのを見てきました。
1) アプリケーションには、単一のスレッドが所有する単一の OPC クライアント インスタンスがあります。クライアント アプリケーションによって自動化されているすべての並列プロセスは、OPC 値の読み取り/書き込み時に、OPC クライアントを所有するスレッドとの何らかのメッセージングまたは同期を使用します。
2) 各スレッドは独自のプライベート OPC クライアントを所有し、それぞれが個別に OPC サーバーと通信します。
個人的には、最も使用されているスキームは前者であることがわかりました。クライアントへの同期呼び出しを行うスレッドを持つ 1 つの OPC (または他の独自仕様) クライアント オブジェクト。実際、ほとんどすべてのプロセス制御の状況で、論理的な現実世界のタスクをエレガントにカプセル化し、それを UI から分離する目的でマルチスレッド化しています。パフォーマンスのためではありません。これらのスレッドは、比較的「長い」期間ブロックしてデータを待機する余裕があります。PLC は、必要に応じて 100 ミリ秒の間喜んで砦を保持します。
どちらを選択するかは、アプリケーションの規模と性質に大きく依存します。外部リアルタイム イベントの待機に長時間を費やす多数の軽量スレッドの場合、アプリケーション内に 1 つの OPC クライアント インスタンスを保持し、多数の独立した接続のオーバーヘッドを節約することは理にかなっています。負荷が高く、動きが速く、OPC を集中的に使用する少数のスレッドの場合は、代わりにそれぞれに独自の OPC クライアントを提供することが理にかなっています 。
また、OPC タグのリフレッシュ レートにも注意してください。多くの場合、サーバーは約 100 ミリ秒ごとにしか更新していません。単一のスキャンを実行するだけでも、PLC で少なくとも 10 ミリ秒かかる可能性があります。データがそれほど迅速に更新されない場合、膨大な数のスレッドが毎秒 100 回サーバーを個別にポーリングすることは意味がありません。
プロセス制御ソフトウェアの場合、本当に必要なのは、多くのアイドル状態または低負荷の CPU 時間を確保することです。スレッドが軽いほど優れています。システム全体の応答性が重要であり、ソフトウェアに高負荷の状況を処理させる能力が重要です (OS が HDD のインデックスを作成する時期であると判断している間に、突然多数のタスクが収束します...いわば、ヘッドルームが歯車を潤滑状態に保ちます)。ほとんどのスレッドは、ほとんどの場合、待機しているだけのはずです。イベントとコールバックは、通常、ここで最も意味があります。
また、ここでも PLC プログラミングを考えることが重要です。たとえば、私のマシンには、非常にタイムクリティカルな操作がいくつかありますが、同時に、実行されるたびに一意のタイミングがとられます。 1 秒またはそれ以上であり、1 日に数百から数千回繰り返され、重要ではありますが、実行されるたびに持続時間が異なります。これらが 2 つの方法で処理されるのを見てきました。1 つはソフトウェアで、もう 1 つは PLC です。前者の場合、ソフトウェアはいつ開始するかを PLC に通知し、ソフトウェアが停止するように通知するまで続行します。これには明らかな落とし穴があります。この場合、単純に時間間隔を PLC に送信してタイミングをとらせる方がはるかに優れています。