8.13. シリアル通信#

USBやシリアルポートといったハードウェアは、TF6340をお使いいただくことでPCのCOMポートにPLCから直接アクセスすることが可能です。

シリアルポートデバイスの扱いとライブラリ準備#

TwinCATでシリアル通信を行うには、次のように3つの方式のデバイスアクセスが可能です。(参考InfoSys

PC COMポート

OS側で容易されたシリアルデバイスにアクセスすることができます。

ELターミナル

EL60xxなどのバスターミナルを通じてEtherCAT経由でシリアル通信する方法です。

仮想シリアルポート

PCIに接続されたUARTデバイスではなく、USBシリアルデバイスなど、仮想的に作成されたOS上のシリアルデバイスにアクセスすることができます。

Tip

仮想シリアルポートを作成するためには、TF6340を別途インストールする必要があります。

また、別途PLCライブラリをインストールすることでPLC上のIOデバイスとして取り扱うことができ、いったん、ComBufferという通信データバッファ構造体を経由することで、3つのデバイス方式が違っていても同じPLCプログラムロジックでデータ送受信を行うことができます。

開発手順#

  1. まずはTwinCATでシリアルポートの受信データにアクセスする物理的なIOを作成します。参考Infosys

    この物理IOにアクセスするには、TF6340パッケージを別途インストールしていただく必要があります。パッケージマネージャからTF6340を指定してインストールを実施してください。

  2. インストール後、PLCプロジェクトにライブラリを追加し参考Infosys、IOとのリンクを行います。

    また、本ライブラリには、物理インターフェースに合わせたIOの型が用意されています。たとえばPC上のCOMポートでしたらPcComInDataPcComOutData、EL6001などでしたら、EL6inData22BEL6outData22Bです。この型で宣言した変数に対してIOにリンクします。

  3. SerialLineControlファンクションブロックの実装

    ライブラリには、ComBufferという構造体型が定義され、送受信それぞれでインスタンス化します。これがデータバッファとなりIOとの中継を行います。アプリケーションはComBufferからデータを入出力します。参考InfoSys

    ComBufferとIOとのデータ入出力制御を行うため、SerialLineControlというファンクションブロックを毎サイクル常時実行します。(参考InfosysのSerialLineControl参照)。このコード例では、ファンクションブロックのインスタンスfbPcComCtrlの引数としてIOの変数のポインタをpComInpComOutにセットし、データ読み書きを行うComBuffer構造体をRxBufferPcComTxBufferPcComにそれぞれセットして常時実行しています。アプリケーション側はこのComBufferの変数を使ってデータの読み書きを行います。

    注釈

    SerialLineControlを実行するタスクサイクルはシリアルポートのIOストリームデータをComBufferに移動する制御を行います。この処理サイクルが低速で、通信相手からの受信データが多くなるとシリアルポートのIOストリームデータがオーバフローとなりデータが破損する可能性があります。独立した十分速いサイクルのタスクで実行していただくことをお勧めします。

  4. Send/Receiveの実装

    アプリケーション側からは次のリンクで示されているファンクションブロック(Send*** や、Receive***)にComBufferを監視させることで、アプリケーション側から任意のバイトやテキストデータを送ったり受信データをパースする、という流れになります。

    ファンクションブロックの実装方法