こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

MX Component にはビット単位複数がない

お疲れ様です。
melsecのDLL、MX Component もどきのDLLを作成中で、writedevice2もどき、readdevice2もどき、setdeviceもどき、はできたわけです。

ところがビット単位の複数点書き込みの関数がmx にはございません。

ゆえに参考となる IFがないので困っています。

ビット単位で複数点読み書きできる関数を実装する場合

ワード単位同様、配列でデータを渡すのが望まれるでしょうか?

投稿日時 - 2018-06-17 18:42:18

QNo.9509305

暇なときに回答ください

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

複数ビット操作やるなら、リードモディファイライトするしか無いのでは
読んだデータにSETやRESET(AND,OR,XOR操作)して書き戻す。
https://qiita.com/t2kojima/items/091447bd4cafde91d17a

投稿日時 - 2018-06-18 18:30:23

補足

ご回答ありがとうございます。
書き込み前にデータを読んで。。

というのはわかりますが、
幸いMCには複数点のビット単位のビット操作が、サポートされておりまする、

ゆえに実装は可能です。ただ三菱の製品にはそれ相当が実装されとおらんのです。

わたくしの質問というのは、

いわゆるシーケンサープログラマの御人が、vb.netで複数ビット操作できるライブラリを所望されるとき、

どういったインタフェースをのぞまれがちなのか?とい質問でございます,

つまり、boolean配列で渡せることをのぞむのか、

int配列にヘキサを書き込み、ヘキサ値のうち、指定点数を超過してるビットはみないやうな、そのやうなインタフェースをのぞむのか?という質問です!

ただ、慣例的なシーケンサープログラマは、ビットたち下げに、wandやworを使用されておりますので、

彼らの水準に準拠すれば、ヘキサで書き込む、バイトまたはイント配列のインタフェースで、かつ、指定点数超過分 はみないというやうな実装がよいかなあ?と思た次第てございます

アルコール大量摂取でまとまらない文章でたいへん申し訳ございません

投稿日時 - 2018-06-18 22:42:10

お礼

自己解決しました。

MX にはビットデバイスのワード単位ではない複数ビット操作関数がありませんが、MCプロトコル仕様にはあるので実装しました。参考となるインタフェースがないので悩んで、

結局、インテジャ配列、すなわちヘキサで渡させるようにしました。

回答ありがとうございました。

投稿日時 - 2018-07-18 21:05:26

ANo.1

MX Component
http://www.mitsubishielectric.co.jp/fa/products/cnt/plceng/smerit/mx_component/index.html
これそのものを直接使用した事は無いのですが
基本的にシリアルコミニュケーションユニット用のMCプロトコルだと思うのですが?
http://www.mitsubishielectric.co.jp/fa/products/cnt/plcq/pmerit/network/serial_com.html
なので、ただ単にMCプロトコルのコマンド
 ワード単位の一括読出し(コマンド: 0401)
 ワード単位の一括書込み(コマンド: 1401)

これらを関数化したダケじゃあないんでしょうか?
MCプロトコルにはビットアクセス命令も有るけれど
これにしたって、単に16ビットアクセスじゃあないだけで
例えばM00~M07の8点読出しとかの複数ビットだし
M00単独の一つダケ読出し言う命令では無い

それともイーサネットのSLMPプロトコル?
そうであっても基本的にMCプロトコルと大差ないと思うけど?

投稿日時 - 2018-06-17 20:51:17

お礼

回答ありがとうございます。

えっとですね、MCプロトコルでは Ethernet ユニットとシリアルユニット両方使えます。もちろん電文は若干違うようですが、基本理屈は同じです。

MCプロトコルにはワード単位読み書き、ビット単位書き込みがございます。ビット単位書き込みは当然、ビットデバイスのみが対象となっております。

それに対してワード単位書き込みではビットデバイス指定することもできます。その場合、ワード(2バイト)単位ですので16点単位の読み書きになります。

次にMX Component の関数の説明について。これはMCプロトコルを使った実装だとは思います。

WriteBlockDevice2, ReadBlockDevice2 という関数はワード単位の読み書きであり、MCプロトコル電文の命令のうち0400, 1400に相当しております。「デバイスの種類(ワード、ビット)」「デバイス番号」「点数」によって読み書きをします。
ビットデバイスを指定した場合は、16× n点になります。

ちなみにデータの渡し方は配列になっております。

次に SetDevice, GetDevice という関数がございます。これは1点もので、ワードデバイス、ビットデバイス両方指定できます。

さて、ビットデバイスの「ビット単位」の複数点書き込みができる関数が(私の見落としでないであれば)MX Component にはありません。つまり、「7点」とか「11点」とかいう点数の書き込みができる関数がないのです。

一方で MCプロトコルではサポートしています。

なので同じように配列で渡すビット単位の読み書き関数を作ろうと思ったのですが、

そもそもビットデバイスを複数点立ち上げるとき、本当に配列のインタフェースが望ましいのか??と思ったわけです。
また、配列の場合どのような型が望ましいのか。

Boolean 配列のインタフェースが果たして利便的によいのか?

利便的には Integer 配列のほうがよいかもしれない。

たとえば3点だけBITを操作したいが、配列長3の配列に &HFF をそれぞれ書き込んだ場合、

配列0 の値のうち bit7 のところまで読み込んでやって、あとは全部無効なデータとしてみないようにする。

逆に言えば2進数がわかってるユーザは最初から配列長1の配列だけ造って &H08以下の値しか書き込まない。。
という具合です。

つまり、DLLを使うのはプログラマですから、「True, True, False・・・」などという値が書き込まれた Boolean 配列をインタフェースにするのは愚ではないか、と思った次第です。

HEXで書き込ませて処理させるほうが無難でしょうか???

投稿日時 - 2018-06-17 21:19:48

あなたにオススメの質問