*

MELSEC iQ-R C言語インテリジェント機能ユニット Linuxスタートアップマニュアル ~プログラムの開発(C言語)~

      2021/08/06

はじめに

三菱電機社製 MELSEC IQ-R C言語インテリジェント機能ユニット(RD55UP06-V/RD55UP12-V)で Linuxを動かしてみました。その際に必要となった、技術情報をまとめてみました。

本記事は全3部構成になっており、今回は「C言語でのプログラムの開発」についてご紹介します。
前回の記事はこちら

三菱電機社製 MELSEC IQ-R C言語インテリジェント機能ユニット(RD55UP06-V/RD55UP12-V) 
https://www.mitsubishielectric.co.jp/fa/products/cnt/plcr/pmerit/it_connect/c_intel.html

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”で開発用のパッケージをインストールします。

【インストールするパッケージ】
・autoconf
・libtool
・automake
・build-essential
・gdb

 [ポイント]

本書ではC言語インテリジェント機能ユニット上でプログラムのビルドとデバッグを行うセルフ開発環境の構築を行います。ホストPCでビルドを行うクロス開発環境については、Timesys社の”TimeStorm”が利用可能です。

“TimeStorm”についてはリネオソリューションズ株式会社へお問合せください。

 

C言語プログラムのビルド

(1) Windows PC上のテキストエディタで以下のプログラムを作成し、”Helloworld.c”で保存してください。

(2) SFTPクライアントを起動して、”Helloworld.c”をC言語インテリジェント機能ユニットの”/root”にコピーします。

 

(3) 以下のビルドコマンドを実行します。

(4) 以下のコマンドでプログラムを実行します。

 【実行結果】

C言語プログラムのデバッグ

GDB(GNUデバッガ)を使ってプログラムのデバッグを行います。詳細な使い方はGNUのWEBサイトでご確認ください。

(1) デバッグを行う場合は以下のようにオプションをつけてビルドコマンドを実行します。

(2) 以下のコマンドでgdbを実行します。

【実行結果】

(3) “b”コマンドで“main”関数にブレークポイントを設定します。

(4) プログラムが実行されると、ブレークポイントを設定した”main”関数の先頭行でストップします。

(5) “n”コマンドを実行するとステップ実行されます。

(6) “u”コマンドを実行すると、ループを抜けるまで処理が実行されます。

(7) “q”コマンドでデバッグを終了できます。

 

CPUユニットとの連携(C言語)

専用関数

CPUユニットと連携する手段として、”C言語インテリジェント機能ユニット専用関数(以降、CITL関数)”と”MELSEC iQ-Rシリーズ通信関数(以降、MDR関数)”の2つの専用関数が用意されています。
Linuxで使用可能な関数はAppendixB(リンク)を参照してください。

シーケンサCPU連携用プログラムのビルド

(1) プログラムの作成

① CITL関数及びMDR関数を使用するプログラムの先頭には、ライブラリ関数のヘッダファイルをインクルードしてください。ヘッダファイルは専用サイトからダウンロードしてください。

プログラム

インクルードの必要なヘッダファイル

CITL関数を使用するプログラム

#include “CITLFunc.h”

MDR関数を使用するプログラム

#include “MDRFunc.h”

【ヘッダファイルのダウンロード先】

Register for Mitsubishi C Intelligent Function Module (CITL) Linux Download

(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との連携例

シーケンサ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を超えた場合にはプログラムを終了します。

[ポイント]

LinuxではCITL_EntryDedicatedInstFunc関数を実行後にユーザプログラムを終了した場合、登録したルーチンは実行されません。登録するルーチンを継続して実行したい場合は、CITL_EntryDedicatedInstFunc関数実行後にユーザプログラムが終了しないよう待機処理を入れてください。

 

Appendix B 関数一覧

C言語インテリジェント機能ユニット(RD55UP06-V/RD55UP12-V)にてLinuxを起動した場合に使用できる関数を以下に示します。

各関数の仕様は「MELSEC iQ-R C言語インテリジェント機能ユニット プログラミングマニュアル[SH-081565]」を参照願います。

 

  • C言語インテリジェント機能ユニット専用関数

関数名

対応

関数名

対応

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

×

  • 新規対応 ○対応 ×未対応
  • ISR用

 

第3部、プログラム開発(Python)編

 - Linux技術ネタ