従来のオートメーション制御ではPLC(Programmable Logic Controllers)やNC(Numeric Controllers)にプログラムし様々な装置を構築します。メリットはたくさんあり、例えばSoftwareとHardwareは完全に分かれてお互いに干渉しないこと。そのHardwareを提供してるPLCメーカーはたくさんあり、Siemens、三菱、Omronなどなどです。
そしてPLCにはプログラムするにIEC61131-3のプログラム言語を使用しています。
その中でいま装置の制御はますます複雑になり、機械メーカーは設計コスト・納期などをへらすだめにいろんな工夫しています。Module化です。装置をModule化することによって、一番低層なModuleはシンプル・機能少ないものになり、自分のアプリケーションに合わせて機能を載せたり、他のModuleと組み合わせたりします。そのような”簡単なModuleたち”が最終的に複雑な装置になります。
機械の構成で大体2種類分けています。
分散制御
機械は機能ことにわけModuleとして分散し、各Module間はField Busなど経由しデータ交換します。そうすることによって、機能編集する場所、ほかのModulesに対する影響は最低限になります。メリットとしては完成のモジュール化実現でき、設計コスト下がることもできますし、メンテンス面・チーム開発面にも向いています。一方、コストが上がり、ModulesのField Bus 通信で不具合ある時の問題もあります、
中央制御
1つ大きなCPUからすべてのTaskを行うのイメージになります。そのCPUがすべての機能やModulesが持つ。メリットとしては簡単直接で、コスト下がり(その分のHardwareは購入しなくてよい)、Modules間のFiledbus通信不具合問題もなくになりますが、反面機能編集するときに他の部分に影響がないか?とははっきり言えませんし、再利用性は分散制御ほど優れていません。
Runtime
TwinACT XAE RuuTimeはTwinCAT Modulesを読み込んでたの環境が提供し、システムのMemory・Task・Fieldbus・Hardwareをアクセスできます。各Modulesは同じのコンパイラでコンパイラする必要がないのメリットがあり、つまり他社が作ったModulesを流用することもできます。
PLC Codeと違って、TwinCAT C++モジュールからのCodeは違うRuntime環境実行しADSでInterfaceします。TwinCAT C++モジュールはKernel Modules (.sys)のなかに実行します。つまりそれらのモジュールは kernel modeライブラリからビルドされています。
標準プログラムとReal-timeプログラム
次はは標準プログラムやTwinCAT Real-Timeプログラムと違いについて話しします。
普通のUser ProgramだとProgramはOSから実行され、そして実行されているときはメモリ分配・Threading・マルチタスクなども管理する必要があります。プログラム内でいつこれを一時止めるか・いつ起動するかもう自分で管理します。このような環境はリアルタイムアプリケーションに向いていません。
TwinCAT C++のアプリケーションコンセプトだと、そのReal-time SystemはTaskから管理され呼び出しのタイミングを処理します。プログラムはサイクル内で実行終わり、制御をXARに返します。モジュール間はProcess I/O経由でやり取りします。
同時並行はThreadのStart・Stopすべてプログラム管理で実行するときのリソースやMemoryも、自己責任になります。
一方でTwinCAT C++はTcCOMがモジュールをTaskから呼び出します。TaksはUpdate時間・優先度設定できます。例えば高優先度のTaskが低優先度のTaskを止めることもできますし、もしHardware上でマルチコアであれな理論上では同時い実行されます。
Modules間のData 交換はMapping機能を使用しています。
最後に、TwinCAT C++は”Windos Kernel Context”と”TwinCAT Real-time context”があります。そしてRuntimeStart,Stopするとき、”TwinCAT Real-time context”が初期化されます。
メモリ関しては、TwinCATは自分のメモリありそれらのメモリが”Nonpaged Pool”から提供します。そしてRouter Memoryがあり、”TwinCAT Real-time context”内でTcCOM Instanceにダイナミック的にMemory分配することできます。
事前準備
C++インストール
Visual Studioのインストール起動し、Programming Languages>Visual C++をCheck入れ、インストールしましょう。
そうすると、Visual StudioでC++に右クリックし、Add New Itemがクリックできるようになります。
Windows Driver Kitインストール
下記のLinkからインストールFileをダウンロードします。
https://www.microsoft.com/en-us/download/details.aspx?id=11800
管理者権限でKitSetupを起動します。
Build EnvironmentsをCheckいれてOKします。
Install Pathが聞かれます。
このInstall PathをCopyしておいてください。
ライセンス同意ででOKします。
しばらく待ちます…
これでインストール完了です。
システム変数追加
Control PanelからConfigurare advanced user profile propertiesをクリックします。
Environment Variablesをクリックします。
New…で新しいシステム変数追加します。
Variable name:WINDDK7
Variable value:C:\WinDDK\7600.16385.1
*注意するのはVariable valueは先CopyしたPathに合わせてください。
これでSystem Variablesが追加されました。
証明書作成
Command PromptでRun as Administratorします。
以下のコマンド入力し、証明書作成します。
makecert -r -pe -ss PrivateCertStore -n CN=MyTestSigningCert
MyTestSigningCert.cer
ううん、なんで?調べてみますと、
あ、Developer Command Promptですね。
もう一度行きましょう。
Run as Administratorします。
Succeedになりました。
念の為、確認してきます。
MyTestSigningCertがちゃんと作られましたね!
環境変数作成
先と同じく、今度は環境変数ですね。
New..します。
Variable name:TWINCATTESTCERTIFICATE
Variable value:MyTestSigningCert
よし、環境変数は作成されていますね。
テストMode
XAEとXARは同じのPCで動いていますので、まずOSをテストMode切り替えて、C++実行できるようにします。
管理者権限でCommand Prompt起動し、以下のコマンドを実行してください。
bcdedit /set testsigning yes
PCを再起動します。
Desktopの右下にはTest Modeのテキストが出てきます。
初めてのC++ Applications
準備終わった所、C++ アプリケーションを作ってみましょう。
Driver Project追加
C++で右クリックし>Add New Item..します。
ここでTwinCAT Driver Projectを選びます。
最初にのアプリケーションはやっばり簡単なものから始まりましょう。
TwinCAT Module Class with Cyclic IOを選びます。
このModuleは定周期で実行します。
Short nameはとりあえず適度でOKです。
これでDriver Projectが追加されました。
Source Files>Module1.cppは今回プログラムするソースFileです。
一回コンパイラし、自分のPCはちゃんとコンパイラできるかどうかも確認しましょう。
Task追加
最初にも言いましたが、Real-timeアプリケーションはTaskから呼び出しなどの管理しています。なのでTaskを追加します。
Task>Add New Itemします。
Taskの名前を適度で入れます。
次はまたC++のところにAdd New Itemします。
TcCOM Object追加します。
Module1は先作成したのC++ Driverですね。
それでTCom Objectが追加されました。クリックします。
ContextのところでTaskの設定を行います。
先のStepで追加したTaskを選びましょう。
これでOKです。
C++ Debugger有効
C++のIconをクリックします。
C++ DebuggerのTabでEnable C++ DebuggerのCheckを入れます。
ProcessにAttach
まずConfigurationをActiveします。
Attachします。
Debug>Attach to processします。
Attach のProcessを選びます。
TransportをTwinCAT XAEしたらLocalhostが出てきます。選んで、Attachします。
変数Monitor
Debug>TwinCAT Live Watchします。
そうすると、Object値などが見えますね。
m_inputsを選び、Valueを30に入れます。
そうするとValueのとなりに(30)が赤くなりますね。
赤枠のボタンをクリックします。
いまValueが30に変わりました。
テスト2
終わるまでもうひとつを変えてみましょう、
M_Counterを検索してください。
このCyclieUpdate()のMethodは周期で更新します。
M_Counterはm_inputs.Valueから積算されます。
M_Counterを自分で周期ことに積算するに変更します。
もう一回先のTwinCAT Live Watchみますと、m_counter値がずっと積算されますね!
はいーお疲れ様です。
もしなにか質問あれば、メール・コメント・Twitterなどでもどうぞ!
Twitterのご相談:@3threes2
メールのご相談:soup01threes*gmail.com (*を@に)