TOPPERS ά⏝࢔࢖ࢹ࢔࣭࢔ࣉࣜࢣ࣮ࢩࣙࣥ㛤Ⓨࢥࣥࢸࢫࢺ㒊㛛㸸 ά⏝࢔࢖ࢹ࢔㒊㛛    ࢔ࣉࣜࢣ࣮ࢩࣙࣥ㛤Ⓨ㒊㛛సရࡢࢱ࢖ࢺࣝ     㸸 Toppers_ASP ࣮࢝ࢿࣝ࡜ Scilab ࡟ࡼࡿ⤌㎸ࡳ࣓࢝ࢺࣟࢽࢡࢫไᚚࢩ࣑࣮ࣗࣞࢩࣙࣥసᡂ⪅㸸 ሷฟ Ṋ ( ࢩ࢜ࢹ ࢱࢣࢩ)ᑐ㇟⪅㸸 ᐇᶵࣞࢫ⎔ቃ࡛࣮ࣔࢱ࣮ྵࡴ࣓࢝ไᚚࣉࣟࢢ࣒ࣛࡢタィ࠾ࡼࡧ᳨ドࠊᏛ⩦ࢆࡋ࡚ࡳࡓ࠸᪉౑⏝ࡍࡿ㛤Ⓨᡂᯝ≀㸸 ࣭Toppers_ASP ࣮࢝ࢿࣝ_SkyEye ࢩ࣑࣮ࣗࣞࢩࣙࣥ⎔ቃ
࣭Cygwin ⎔ቃ(32bit ⎔ቃ࡜ࡋࡲࡋࡓ)  ࣭Eclipse3.6_Helios(+ Zylin Embedded ࢹࣂࢵ࢞)  ࣭VisualC++2010Express ∧(SkyEye ௜ᒓࡢ devicemanager ࡟ྵࡲࢀࡿ COM ࢜ࣈࢪ࢙ࢡࢺࢆ⏝࠸ࡓ๭㎸ࡳ㸩࣓ࣔࣜඹ᭷ DLL ࢔ࣉࣜసᡂ⏝)࣭Scilab5.5.0(࣮ࣔࢱ࣮ไᚚ⏝ࢩ࣑࣮ࣗࣞࢩࣙࣥ⎔ቃ)┠ⓗ࣭≺࠸࣭⤌㎸ࡳ࣓࢝ไᚚࢆጞࡵ࡚ࡳࡓ࠸ࡀࠊᶵᮦࠊண⟬࡟ไ⣙ࡀ࠶ࡿࠋ࣭ᮘୖࡢไᚚ᪉ἲࢆᐇᶵ࡛ື࠿ࡍ๓࡟஦๓᳨ドࡋࡓ࠸ࠋ࣭ホ౯ᶵᮦࡀୖࡀࡗ࡚ࡃࡿ๓࡟ඛ⾜࡛ไᚚࣉࣟࢢ࣒ࣛࡢ㛤Ⓨࢆ㐍ࡵࡓ࠸ࠋ࣭⤌㎸ࡳ࡟ࡼࡿ࣓࢝ไᚚࢆᏛ⩦ࠊయ㦂ࡋࡓ࠸ࠋ࡜࠸ࡗࡓせồ࡟ᑐᛂࡍࡿࡓࡵ࡟ࠊ࣮࢜ࣉࣥࢯ࣮ࢫ⎔ቃ࡟ࡼࡿࠊ࣓࢝ไᚚࡢタィ/᳨ド⎔ቃࢆᥦ᱌ࡋࡲࡍࠋ㸦2013 ᖺᗘᛂເࡢ JSP ࣮࢝ࢿࣝ∧࡛ࡢෆᐜࢆ ASP ࢩ࣑࣮ࣗࣞࢩࣙࣥ⎔ቃ࡬ᒎ㛤ࡋࡲࡋࡓࠋ㸧

2

目次

目次
アイデアアプリケーションの概要

1

構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3
3

1.2 今回応募内容の主要な変更点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1
Toppers↔Scilab 間プロセス間通信の方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

デバッグ用統合環境の変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31.1

1.2.2
2

34

アプリケーションの作成

42.1 ASP カーネルシミュレーション環境の立上げ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 ASP カーネル ↔ Scilab 間のプロセス間通信 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1
デバイスマネージャー機能の適用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4442.2.2
VisualC++2010Express 環境での COM オブジェクトアプリケーションの作成 . . . . . . . . . . . . .
2.3 Scilab 側 DC モーターモデルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

462.4 サンプルプログラムの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4.1
ファイル構成 (JSP カーネル版と同等です) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4.2
制御仕様 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

777

アプリケーションの動作確認

73.1 サンプルアプリケーションの起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1
TOPPERS 側 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.2Scilab 側 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7783.2 シミュレーションによる動作確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.1モーターの駆動確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

993.2.2モータの待ち合わせ駆動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 (評価用) 割込みでのブレークについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1010まとめ1031 アイデアアプリケーションの概要
2013 年度の JSP カーネルと Scicos lab によるメカトロニクスシミュレーション の内容をもとに、機能を付加し、ASPカーネルでのシミュレーション環境へ展開しています。

1.1 構成ASP カーネル側のシミュレーションは Toppers カーネル向けシミュレーション環境 (SkyEye シミュレーション環境) を用いました。また、モーター側のシミュレーション環境も従来の Scicos Lab から Scilab(バージョン 5.5.0)32bit 版 に変更しています。基本的な操作方法はほとんど変わりません。*1
上記構成にて、2 モーターの制御を行い、タスク/割込みの動作確認をします。

1.2 今回応募内容の主要な変更点
1.2.1

Toppers↔Scilab 間プロセス間通信の方法■(前回)JSP カーネル

• 割込み → デバッグコンソールへ追加した割込み機能へ Scicos Lab 側からメッセージ送信 (DLL アプリ)
• 共有メモリ → DLL アプリ内に作成した共有セクションを使用 (#pragma data seg)■(今回)ASP カーネル

• 割込み → SkyEye 付属の devicemanager より提供される COM オブジェクト機能を使用”RaiseInterrupt(ID)”• 共有メモリ → SkyEye が提供する共有メモリ機能 (skyeye.conf にて設定) により設定し、devicemanager により提供される COM オブジェクト機能を用いて、共有メモリを読み/書き”CKernel− >Write(...)”、”Read(...)”。

1.2.2 デバッグ用統合環境の変更
VisualC++2010Express → Eclipse(Herios 版:日本語化環境) に変更 (Cygwin 上で実行のため)。*2

図1*1 現在は 5.5.1 にバージョンアップしています。
*2 最新の 4.4(Luna) 環境でも構いません。

アプリケーションの概要

2 アプリケーションの作成

42 アプリケーションの作成
2.1 ASP カーネルシミュレーション環境の立上げ
ASP カーネルシミュレーション環境の立上げは、(CQ 出版社様) インターフェース 2012 年 5 月号 の「TOPPERS カーネル用シミュレーション環境 TISE の使い方」を参照し行いました。一部追加作業がありましたので、追記します。
■devicemanager のインストールについて (regist.bat ファイルの変更)

REM デバイスマネージャの登録 (exe と dll ファイルをフルパスで指定:"/"は"￥"に読み替えてください)
devicemanager /REGSERVER
regsvr32 devicemanagerps.dll → win32PC は問題ありませんでした。
C://Windows/System32/regsvr32.exe
D://work/skyeyeskyeye devm package-1.0.5/skyeye devm package-1.0.5/bin/devicemanagerps.dll■Cygwin のインストールについて”make”パッケージは”devel”パッケージに含まれるようですのでこれをインストール。
その他は紙面の通りとなります。ASP カーネルが動けば OK ですので、同記事の” 4 実行トレースログ以降は省略しています。なお、Eclipse 環境の設営については、こちら (おそらく松浦様) のサイトを参照しています。

2.2 ASP カーネル ↔ Scilab 間のプロセス間通信
2.2.1 デバイスマネージャー機能の適用
TOPPERS カーネル向けシミュレーション環境 に含まれる”devicemanager 機能 (COM オブジェクト)”を用いて、Scilab側とのメモリの共有/タイマ割込みの機能を実装しました。SkyEye 環境を解凍すると devicemanager フォルダがあるので、”devicemanager.h”、”devicemanager i.c”ファイルを使用しています。*32.2.2 VisualC++2010Express 環境での COM オブジェクトアプリケーションの作成”devicemanager.h”、”devicemanager i.c”から、デバイスマネージャー部の COM オブジェクトによるプロセス間通信機能にアクセスするアプリケーションを作成します。作成には VisualC++2010Express を使用しました。Express 版です
ので COM オブジェクトそのものを作ることは出来ませんが、既存の COM オブジェクトを使用するアプリケーションは作成可能です。作成したアプリケーションは DLL ファイルとして、Scilab 側へ読み込みます。
表 1 に使用した COM 機能をまとめます。プロセス間通信自体は実現出来たのですが、私自身が COM オブジェクトのプログラミングに疎いため、CDevice 機能と CKernel 機能が混在してしまいました。*4 COM プログラミングについては、dŽƉƉĞƌƐ ^ŬǇǇĞᣑᙇ䝕䝞䜲䝇䝬䝛䞊䝆䝱䞊䕔ĚĞǀŝĐĞŵĂŶĂŐĞƌ͘ĞǆĞĞǀŝĐĞ͗͗ZĂŝƐĞ/ŶƚĞƌƌƵƉƚ;/Ϳ<ĞƌŶĞů͗͗tƌŝƚĞ;ĂĚƌ͕ ƐŝǌĞ͕ĚĂƚĂͿ䠖ඹ᭷䝯䝰䝸䞉๭㎸䜏せồ䞉఩⨨ͬ㏿ᗘ䛾ィ

WtD䝕䞊䝍䛾ㄞ䜏㎸䜏

図2SkyEye 拡張デバイスマネージャーによるプロセス間通信*3 devicemanager は COM オブジェクトの定義、devicemanager i.c は COM オブジェクトのクラス ID を定義*4 Scilab 側はデバイス側なので、基本 CDevice でまとめようとしましたが断念しました。

2.2 ASP カーネル ↔ Scilab 間のプロセス間通信

5సᡂ䛾㒔ྜୖ䚸͘Đї͘Ś䝣䜯䜲䝹䛸䛥䛫䛶䛔䛯䛰䛝䜎䛧䛯䚹

図3

VisualC++2010Express による COM オブジェクトによるプロセス間通信アプリの作成 (DLL ファイル)

プロフェッショナル VisualC++2010(日経 BP 社様) の第 2 章「COM プログラミング」を参考にしました。
表 1 使用した COM オブジェクト類まとめ機能

使用クラス関数

備考

共有メモリ読み込み
共有メモリ書き込み
割込み要求発行

CkernelCkernelCDeviceRead(...)
Write(...)
RaiseInterruput(ID)CDevice → OnRead のアクセスが分からず
CDevice → OnWrite のアクセスが分からず
ID は 0 番を指定 (sample.cfg では 16 番を設定)

なお、共有メモリの生成は SkyEye.exe 起動時に読み込まれる skyeye.conf で設定しました。
■SkyEye.conf の設定
途中省略．．．

mem_bank: map=M, type=RW, addr=0x00000000, size=0x08000000
mem_bank: map=S, type=RW, addr=0x80001000, size=0x00001000#, devm_addr=0x80001000〜0x80001FFF
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
以下省略．．．

ඹ᭷㡿ᇦ䛾㏣ຍ

図4SkyEye.conf で共有メモリを設定2 アプリケーションの作成

6

共有メモリは表 2 のように区画しました。評価用 (未記載) のデータも含めて、計 44 バイトを使用しています。*5
表2共有メモリの内訳 (各データサイズはいずれも 4byte です)

アドレス名機能

ベースアドレスからのオフセット

備考

MOTOR INT ENABLE
MOTOR1 PWMDUTY
MOTOR1 PWMPERIOD
MOTOR2 PWMDUTY
MOTOR2 PWMPERIOD
MOTOR1 SPEED
MOTOR1 POSITIONMOTOR2 SPEED
MOTOR2 POSITION

割込み発行許可
モータ 1 用 PWMDuty
モータ 1 用 PWM 周期
モータ 2 用 PWMDuty
モータ 2 用 PWM 周期
モータ 1 用速度
モータ 1 用位置
モータ 2 用速度
モータ 2 用位置

0byte
4byte
8byte
12byte16byte20byte24byte28byte32byte

割込みデバッグ用
未使用 (評価用)
未使用 (評価用)

2.3 Scilab 側 DC モーターモデルの作成
DC モーターモデルは昨年度と同等です。前回、2 モータにしては、モデル規模が大きかったこともあり、今回は各モー*6 以下モデルを掲載します。パラメータ行列 ABCD の内訳は以下タの要素を行列パラメータにしてスッキリさせています。のようにしています。左上がモータ 1 用で、右下がモーター 2 用です。簡単のためどちらも同じパラメータとしています。

ẋ = Ax + Bu
y = Cx + Du˙   
i1−R/L −Ke/L 0000i1E/L0ω˙1   Kt/J  −D/J 00000    ω1   0[ θ˙1   0  θ1   0100000  =  +  u1pwm1
 i˙2   0
  i2   0
 u2pwm200−R/L
−Ke/L
0E/L
    ω˙2   0
00 Kt/J−D/J 0 ω2   00 000010
θ200
θ˙2   i1
1 0 0 0 0 0i1ω1  0 1 0 0 0 0 ω1 
    θ1   0 0 1 0 0 0   θ1  =  i2  0 0 0 1 0 0  i2  (D 項は 0 のため省略しています)   ω2  0 0 0 0 1 0 ω2 θ20 0 0 0 0 1
θ2]

R : 巻線抵抗、L : コイルインダクタンス、E : 印可電圧 : Ke モータ逆起電力定数、J : モータ慣性モーメント、D モータ粘性抵抗 : 、Kt モータ電流トルク係数 : 、i : 電流、ω : モータ角速度、θ : モータ角度

䞉఩⨨䚸㏿ᗘ䛾ィ䞉๭㎸䜏せồ䛾Ⓨ⾜䝃䞁䝥䝸䞁䜾䝍䜲䝬ϱϬϬʅƐ;䝅䝭䝳䝺䞊䝅䝵䞁ୖ䛾್Ϳ䠎䝰䞊䝍ศ䜢⾜ิᙧᘧ䛷グ㏙

WtDไᚚಙྕ
䛾ධຊ

図5Scilab 側の DC モータシミュレーションモデル

*5 簡単のため SkyEye.conf では、共有領域を 4096byte(0x1000) としています。
*6 モデルを整理することでシミュレーション速度 UP を期待しましたが、特に変わりませんでした．
．
．

2.4 サンプルプログラムの作成

7

2.4 サンプルプログラムの作成
2.4.1 ファイル構成 (JSP カーネル版と同等です)
1. Sample1.cfg：モーター用タスク等 OS リソース追加
2. Sample1.c/h：評価用プログラム追加
3. Motor1.c/h：モーター 1 制御タスク、割込み、HAL 層の実体 / 制御パラメータ定義、公開関数定義
4. Motor2.c/h：モーター 2 制御タスク、割込み、HAL 層の実体 / 制御パラメータ定義、公開関数定義
5. Rtos api.h：OS サービスコールのラッパ関数定義

2.4.2

制御仕様

モータの制御仕様を図 6 に示します。今回のサンプルプログラムでは減速制御開始距離を短くしています。
㧗㏿(100cm/s)
୰㏿
ప㏿(10cm/s)
ṧࡾ5cm
๭㎸ࡳ㛫㝸ࡣ500µs

ṧࡾ0cm

図6

評価用モータ制御仕様

表3

評価用キーボタンコマンドの内訳

ボタン名

動作内容

備考

”i”
”a”
”b”
”c”
”d”
”e”
”f”

両モータの初期化
モータ 1 駆動 (停止待ち有)モータ 1 駆動 (停止待ち無)モータ 1 駆動 (モータ 2 の減速開始を待つ)
モータ 2 駆動 (停止待ち有)モータ 2 駆動 (停止待ち無)モータ 2 駆動 (モータ 1 の減速開始を待つ)

最初に必ず実行願います。

3 アプリケーションの動作確認
3.1 サンプルアプリケーションの起動
3.1.1

TOPPERS 側

2.1 の作業で準備した eclipse 上の ASP 環境を動かします。まず、Cygwin 上で SkyEye を起動します。

図7

SkyEye の起動

3 アプリケーションの動作確認

8

この時、SkyEye の起動に合わせて、devicemanager も起動すると思いますが、起動しない場合は、devicemanager.exeを手動で立上げてください。*7 次に、Eclipse 環境を起動します。デバッグ構成の設定が完了していると、ショートカットから起動できます。デバッグ環境が起動すると、動作前に一旦ブレークで止まりますので、デバッグの再開ボタンを何度か押して実行してください。私の環境では 3 回でした。

図8

デバッグ環境の起動

Scilab 側
次に Scilab 側を起動します。まず asp/obj フォルダに移動します。”motorsci.sci”ファイルを実行すると、デバイスマネージャー部の COM プロセス間通信アプリケーション (DLL ファイル) を Scilab 側へダウンロードします.
3.1.2

図 9 プロセス間通信用の DLL ファイルの読み込み*7 私の環境では途中から自動で起動しなくなりました。

3.2 シミュレーションによる動作確認

9motor scilab.zcos を立ち上げます。シミュレーション開始ボタン (再生ボタン) を押して実行してください。

図 10

モータ用シミュレーションモデルの立上げ

3.2 シミュレーションによる動作確認
3.2.1

モーターの駆動確認

両者が起動した状態で、Cygwin 上で表 3 のキーボタンを押すと、動作を確認出来ます。

図 11

シミュレーションによるモータ制御動作確認 (最初に”i”ボタンで初期化をお願いします)4 まとめ10
3.2.2 モータの待ち合わせ駆動

イベントフラグの動作確認のため、相手側モータが減速に移行したのを待って駆動開始する動作を追加しています。

䝰䞊䝍ϭ㥑ືせồ䝰䞊䝍Ϯ㥑ືせồ䝰䞊䝍ϭ䛾ᚋ䛩䛠䝰䞊䝍ϭ䛜ῶ㏿䛻⛣⾜䛧䛯䛸䛣䜝䛷䜲䝧䞁䝖䝣䝷䜾ᚅ䛱ゎ㝖䝰䞊䝍Ϯ䛜㉳ື䜲䝧䞁䝖䝣䝷䜾ᚅ䛱

図 12

モータ 1、2 の待ち合わせ駆動 (黒:モータ 1 / 赤：モータ 2 です)

3.3 (評価用) 割込みでのブレークについて割込み制御の評価用に、共有メモリ上にフラグを設けて簡易的なブレーク機能を持たせています。表 2 の MO-

TOR INT ENABLE を 0/1 フラグとして動作させ、以下のように制御しています。
1. Scicos 側の割込み発行時に 1 設定
2. Scicos 側は同フラグが 0 になるのを待つ (while 待ち)
3. TOPPERS 側のモータ割込終了時に 0 設定
4. Scicos 側でフラグが 0 になったことを確認して待ち解除
こうすることで、TOPPERS 側に連動して、Scicos 側をブレーク (停止) させることが出来ます。ただし以下の制限があるためデフォルトは無効にしています。
■制限事項

TOPPERS 側を中断させた状態で Scilab を強制終了すると、while 待ちから抜けてこないため終了できない場合があります。そのため同機能を有効時は TOPPERS 側を再開させてから、Scilab を終了してください。
■設定切り替え部 (VisualC++ プロジェクト側の motor com.h ファイル)/* 評価用 シミュレーションの簡易ブレーク機能 (デフォルト無効) */#define DEBUG_SCICOS (0) /* 0:無効 1:有効 *//* COM オブジェクト用 アドレス定義 (SkyEye の定義と合わせる) */#define MOTOR_REG_BASE (0x80001000)
以下省略…

4 まとめ
TOPPERS ASP カーネルシミュレーションと、Scilab による DC モータシミュレーションを連動させて、組込み制御のシミュレーション評価環境を作成しました。プロセス間通信は、SkyEye 付属のデバイスマネージャー機能を用いています。作成時に課題はありましたが、なんとか動く形に持って行けましたので、こちらの内容にて応募致します。*8
時間的な制約もあり、サンプルプログラムの内容まで説明が及びませんでした。申し訳ございません。
以上となります。よろしくお願致します。
*8 デバイスマネージャの使い方について、追加の情報がございましたら、ホームページ等でご提供お願い致します。