2021 年 06 月 24 日 Linux 技術ネタ
三菱電機社製 MELSEC IQ-R C 言語インテリジェント機能ユニット (RD55UP06-V/RD55UP12-V) で Linux を動かしてみました。その際に必要となった、技術情報をまとめてみました。
本記事は全 3 部構成になっており、今回は「 C 言語でのプログラムの開発」についてご紹介します。
前回の記事はこちら
三菱電機社製 MELSEC IQ-R C 言語インテリジェント機能ユニット (RD55UP06-V/RD55UP12-V)
MELSEC IQ-R C 言語インテリジェント機能ユニット のハードウェアについての詳細や、専用関数については、三菱電機様にお問い合わせください。Linux に関するお問い合わせは、リネオソリューションズ株式会社 ( sales@lineo.co.jp ) までご連絡ください。
(1) SSH クライアントで Linux にリモートログインします。
(2) Linux のテキストエディタで "/etc/apt/source.list" を開き、以下を追加して保存してください。
deb http://ftp.de.debian.org/debian stretch main
(3) "apt-get update" を実行し、パッケージリストの更新を行います
(4) "apt-get install" で開発用のパッケージをインストールします。
(1) Windows PC上のテキストエディタで以下のプログラムを作成し、"Helloworld.c" で保存してください。
(2) SFTP クライアントを起動して、"Helloworld.c" を C 言語インテリジェント機能ユニットの "/root" にコピーします。
(3) 以下のビルドコマンドを実行します。
(4) 以下のコマンドでプログラムを実行します。
GDB (GNU デバッガ) を使ってプログラムのデバッグを行います。詳細な使い方は GNU の WEB サイトでご確認ください。
(1) デバッグを行う場合は以下のようにオプションをつけてビルドコマンドを実行します。
(2) 以下のコマンドで gdb を実行します。
(3)"b" コマンドで "main" 関数にブレークポイントを設定します。
(4) プログラムが実行されると、ブレークポイントを設定した "main" 関数の先頭行でストップします。
(5) "n" コマンドを実行するとステップ実行されます。
(6)"u" コマンドを実行すると、ループを抜けるまで処理が実行されます。
(7)"q" コマンドでデバッグを終了できます。
CPU ユニットと連携する手段として、"C 言語インテリジェント機能ユニット専用関数 (以降、CITL 関数)" と "MELSEC iQ-R シリーズ通信関数(以降、MDR 関数)" の 2 つの専用関数が用意されています。
Linux で使用可能な関数は AppendixB を参照してください。
(1) プログラムの作成
① CITL 関数及び MDR 関数を使用するプログラムの先頭には、ライブラリ関数のヘッダファイルをインクルードしてください。ヘッダファイルは専用サイトからダウンロードしてください。
プログラム | インクルードの必要なヘッダファイル |
---|---|
CITL 関数を使用するプログラム |
#include "CITLFunc.h" |
MDR 関数を使用するプログラム |
#include "MDRFunc.h" |
mitsubishi-CITL-linux-registration
(2) CITL 関数及び MDR 関数の実行前には、必ず一度だけ以下の初期化関数を実行してください。関数実行によりシーケンサ CPU 連携に必要なモジュールがメモリ上にロードされます。関数未実行の場合、専用関数を実行することはできません。
プログラム | 実行の必要な関数 |
---|---|
CITL 関数を使用するプログラム | CITLAppInit() |
MDR 関数を使用するプログラム | mdrAppInit() |
(3) ビルド
ビルドする場合は、以下のように "/usr/lib/citl" と "/usr/lib" ライブラリをリンクしてビルドを実行してください。
gcc <FILENAME> -Wall -L"/usr/lib/citl" -L"/usr/lib" -lCommManager -lECHLP_PRJ -lECMPL -lVxCITLFunc -lVxMDRFunc -lVxMDRFuncW -lVxInteliDed -lVxWorksSysDrv -lVxMRbfOS -lVxMRbfDrv -lINFO_PRJ -lCTRL_PRJ -lBASE_PRJ -lTAG_PRJ -lv2lin-0.1 -ldl -lpthread -lLinuxEmu -lrt -o <OUTFILE>
<FILENAME> ビルド対象となるソースコード名 (***.c, ***.cpp)
<OUTFILE> 出力対象となる実行ファイル名 (拡張子は未指定)
シーケンサ CPU と連携するためのプログラム例を示します。各機能の詳細は「MELSEC iQ-R C 言語インテリジェント機能ユニットユーザーズマニュアル(応用編)[SH-081564]」の「1.1.プログラム関連機能」を参照願います。
(1) C 言語インテリジェント機能ユニットへのバッファメモリアクセス
CITL_ToBuf/CITL_FromBuf 関数を使用して C 言語インテリジェント機能ユニットのバッファメモリにアクセスできます。
以下の例では、C 言語インテリジェント機能ユニットのバッファメモリアドレス "16384" への値書込みと読出しを行います。
(2) シーケンサ CPU へのデバイスメモリアクセス
MDR 関数を使用してシーケンサ CPU のデバイスメモリにアクセスできます。
以下の例では、シーケンサ CPU の D0 デバイスへの値書込みと読出しを行います。
(3) シーケンサ CPU からのユーザプログラム実行
専用命令 (G(P).CEXECUTE) を使用して、CITL_EntryDedicatedInstFunc 関数で登録したルーチン(ユーザプログラム)をシーケンサ CPU から実行することができます。
MELSEC iQ-R プログラミングマニュアル( ユニット専用命令編 )[SH-081975] の「13 C 言語インテリジェント機能ユニット用命令」を参照願います。
以下の例では、シーケンサ CPU の専用命令 (G(P).CEXECUTE) 実行時に C 言語インテリジェント機能ユニットのバッファメモリアドレス "16384" の値を加算する関数 "func" を呼び出します。バッファメモリ値が 3 を超えた場合にはプログラムを終了します。
C 言語インテリジェント機能ユニット (RD55UP06-V/RD55UP12-V) にて Linux を起動した場合に使用できる関数を以下に示します。
各関数の仕様は「MELSEC iQ-R C 言語インテリジェント機能ユニット プログラミングマニュアル[SH-081565]」を参照願います。
関数名 |
対応 |
関数名 |
対応 |
CITLAppInit |
● |
CITL_SetCollectData |
× |
CITL_ChangeFileSecurity |
× |
CITL_SetLEDStatus |
○ |
CITL_ClearError |
○ |
CITL_SetSyncTimeStatus |
× |
CITL_DisableYInt |
× |
CITL_ShutdownRom |
× |
CITL_EnableYInt |
× |
CITL_StartCollectData |
× |
CITL_EntryDedicatedInstFunc |
○ |
CITL_StartWDT |
× |
CITL_EntryTimerEvent |
× |
CITL_StopCollectData |
× |
CITL_EntryWDTInt |
× |
CITL_StopWDT |
× |
CITL_EntryYInt |
× |
CITL_SyncTime |
× |
CITL_FromBuf |
○ |
CITL_SysClkRateGet |
× |
CITL_GetCollectData |
× |
CITL_SysClkRateSet |
× |
CITL_GetCounterMicros |
× |
CITL_ToBuf |
○ |
CITL_GetCounterMillis |
× |
CITL_UnmountMemoryCard |
× |
CITL_GetErrInfo |
○ |
CITL_WaitCollectDataRecvEvent |
× |
CITL_GetFileSecurity |
× |
CITL_WaitSwitchEvent |
× |
CITL_GetIDInfo |
○ |
CITL_WaitTimerEvent |
× |
CITL_GetLEDStatus |
○ |
CITL_WaitYEvent |
× |
CITL_GetSerialNo |
○ |
CITL_X_In_Bit |
○ |
CITL_GetSwitchStatus |
× |
CITL_X_In_Word |
○ |
CITL_GetTime |
× |
CITL_X_Out_Bit |
○ |
CITL_GetUnitStatus |
× |
CITL_X_Out_Word |
○ |
CITL_MountMemoryCard |
× |
CITL_Y_In_Bit |
○ |
CITL_RegistEventLog |
○ |
CITL_Y_In_Word |
○ |
CITL_ResetWDT |
× |
- |
- |
2024 年 09 月 02 日 Vigiles サポート
2024 年 03 月 01 日 Vigiles サポート
2023 年 08 月 28 日 Vigiles サポート
2024 年 03 月 26 日 Yocto Project よもやま話
2023 年 07 月 25 日 Yocto Project よもやま話
2023 年 06 月 20 日 Yocto Project よもやま話
2024 年 01 月 10 日 Linux 技術ネタ
2023 年 12 月 12 日 Linux 技術ネタ
2023 年 03 月 31 日 Linux 技術ネタ
2024 年 07 月 26 日 イベントレポート
2024 年 07 月 09 日 イベントレポート
2024 年 06 月 03 日 イベントレポート
2023 年 05 月 30 日 リクルート
2022 年 12 月 27 日 リクルート
2022 年 09 月 27 日 リクルート
2024 年 09 月 25 日 信州リネオ便り
2024 年 08 月 20 日 信州リネオ便り
2024 年 08 月 07 日 信州リネオ便り
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 13 日 マーケティング統括部
2019 年 04 月 25 日 マーケティング統括部
2018 年 12 月 18 日 マーケティング統括部