LinuxCNCのPyVCPのサンプルで遊んでみる。

LinuxCNCのPyVCP(Python Virtual Control Panel)のサンプルで遊んでみました。

MCUでプログラムを書く事を考えればスクリプト言語でとても分かりやすく、割りと簡単にこんなことも出来ます。




LinuxCNC公式のPython Virtual Control Panelのページに有るサンプルをテキストエディタを開いてほぼ丸写しで入力、xmlの拡張子で保存。
端末を開いてhalrunして、loadusr pyvcp [ファイル名」.xml とすれば表示されます。

動画のように、パネル内の数値、信号を繋ぐにはshow pinで現在有るピンの名前を見て、net [任意の信号線名] [ピンの名前] => [ピンの名前] で繋ぎます。

矢印の方向は信号の方向。
テキストで記述するので難しく思うかもしれませんが、実際の回路と同じでピンを信号線で繋ぎます。
もちろんピンから出ている信号のフォーマット、bitか数値か、は揃えなければ繋がらずエラーになります。
信号の変換にはリアルタイムコンポーネント内の変換コンポーネントを使います。

必要であるならスレッドをを作り、loadrtでリアルタイムコンポーネントを呼び出し、スレッドに登録、使用します。



HAL Manual V2.6.10-10-g1824ef0, 2015-10-09

上記公式HALのマニュアル内に、Basic HAL ReferenceやAdvanced HAL Tutorial が有ります。

Tutorialは、内部信号の数値を表示出来るHalMeterや、オシロスコープライクな表示が出来るHalScopeなどを使うと理解が早いと思います。

Tutorialをやってみると良く判るのですが、LinuxCNC自体Linuxそのもので、カーネルスレッドとユーザースレッドとゆうものが有ります。LinuxCNCはリアルタイムカーネルと呼ばれる物を使用しているのでコンポーネントの呼び出しがリアルタイムのloadrtと、ユーザー空間での作動のloadusrが有ります。

NCマシンとしての作動で、一定以上の遅れの許されないコンポーネントはカーネルのコンポーネントとして入っており、loadrtで呼び出されます。また、少々の遅延が許されるユーザーインターフェース等のコンポーネントはloadusrで呼び出します。
リアルタイムコンポーネントは、一定時間内に繰り返し実行されるように、threadに登録します。

このthread、LinuxCNCの最初から入っている3軸NCの初期設定等では、低速なServoThreadと、高速なBaseThreadが使われ、LatencyTestでは、この2つのスレッドのジッタ(この場合一定時間に繰り返されるThreadの実行周期のズレ)を計測します。
ズレが大きいと、位置制御自体がズレるので。


StepGen(Stepパルスジェネレータ)などは、高速なBaseThreadを使用します。

BeagleboneBlack/GreenのLatencyTestには、この高速なBaseThreadが有りません。
どうやって、Stepパルスを生成しているか、とゆうと、BeagleBoneのMCU上に有るPRU(プログラマブルリアルタイムユニット)にStepgenがプログラムされて実行されています。
このPRU、メインのCPUとは関係なく動いているので、FPGA等のハードウエアでStepパルスジェネレーターを実装したのと同じように作動します。

低速なServoThreadでも、1ms周期でのフィードバック制御された実行なので、NC制御部分には規格上1mS以上の遅延を許すUSB機器の接続ができません。
また、サーボ駆動とフィードバック信号を制御する軸分入出力するため、低速なシリアル信号での入出力もできません。
この辺りがPC上でのLinuxCNCを運用するネックとなり、素のPCですと入出力する手段が直接Stepパルスを出力するパラレルポート位しか有りません。
リアルタイムな(この場合、ServoThreadの周期1mS以内)フィードバック制御が基本なので高速ではありませんが、パラレルポートにエンコーダー入力が出来、NCコントローラー内でのクローズドループなサーボ制御が可能です。
できれば、PCIやPCIE接続のFPGAカードを使用すると、FPGA上にStepgenや、PWMgen、エンコーダーインターフェースが置けるので、高速な入出力が可能となります。
パラレルポート自体、EPP/ECPモードとゆうものを持っており、割りと高速にデータ入出力が可能で、それを利用したパラレルポートに取り付けるタイプのFPGA、Pluto-PにStepパルスジェネレータを載せたPluto-Serve、PWMgen、エンコーダーインターフェースを載せたPluto-Servoなどを使うとPCI,PCI-Eなインターフェースには劣りますが、パラレルポートを使用した場合に比べ高速に、また、単純入出力ピン等も増えます。

loadusrで使うコンポーネントはNC制御で使うスレッドに登録しないので、USB機器の接続が可能です。
また、ユーザーコンポーネントはPythonでの記述もできるのでNet上にはリアルタイムコンポーネントから取り出した信号を、ユーザーコンポーネントにて使用し、USB接続のMCU等でキャラクタLCD等に情報を表示させたりする作例が色々とあります。
モーション制御でない、低速でも問題ないような制御であれば、USB接続にてデータ入力、制御出力なんて使い方もアリかもしれません。
スポンサーサイト

テーマ : 自作・改造
ジャンル : コンピュータ

コメントの投稿

非公開コメント

ライセンス
アクセスカウンター
プロフィール

あきらひとし。

Author:あきらひとし。
木工用CNCルーターフレームと、ステッピングモータードライバを作ってみました。
たぶん記事は一般的な人には殆ど必要のない事ばかりなの、かも。

モーターは回るだけでも楽しい。制御(速度、トルク、位置)できるともっと楽しい!

メールフォーム

名前:
メール:
件名:
本文:

リンク
最新記事
カテゴリ
スポンサードリンク
スポンサードリンク 
スポンサードリンク
オンラインカウンター
現在の閲覧者数:
検索フォーム
RSSリンクの表示
最新トラックバック
最新コメント
月別アーカイブ