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

このQ&Aのポイント
  • MX Componentには、ビット単位の複数点書き込みの関数が存在しません。
  • ワード単位と同様に、ビット単位で複数点読み書きするためには、配列でデータを渡す方法が望まれます。
  • MX Componentに関するDLL、MX Component もどきのDLLを作成中ですが、必要なビット単位の複数点書き込みの関数が見つかりません。困っています。
回答を見る
  • 締切済み

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

お疲れ様です。 melsecのDLL、MX Component もどきのDLLを作成中で、writedevice2もどき、readdevice2もどき、setdeviceもどき、はできたわけです。 ところがビット単位の複数点書き込みの関数がmx にはございません。 ゆえに参考となる IFがないので困っています。 ビット単位で複数点読み書きできる関数を実装する場合 ワード単位同様、配列でデータを渡すのが望まれるでしょうか?

noname#235633
noname#235633

みんなの回答

  • TIGANS
  • ベストアンサー率35% (244/680)
回答No.2

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

noname#235633
質問者

お礼

自己解決しました。 MX にはビットデバイスのワード単位ではない複数ビット操作関数がありませんが、MCプロトコル仕様にはあるので実装しました。参考となるインタフェースがないので悩んで、 結局、インテジャ配列、すなわちヘキサで渡させるようにしました。 回答ありがとうございました。

noname#235633
質問者

補足

ご回答ありがとうございます。 書き込み前にデータを読んで。。 というのはわかりますが、 幸いMCには複数点のビット単位のビット操作が、サポートされておりまする、 ゆえに実装は可能です。ただ三菱の製品にはそれ相当が実装されとおらんのです。 わたくしの質問というのは、 いわゆるシーケンサープログラマの御人が、vb.netで複数ビット操作できるライブラリを所望されるとき、 どういったインタフェースをのぞまれがちなのか?とい質問でございます, つまり、boolean配列で渡せることをのぞむのか、 int配列にヘキサを書き込み、ヘキサ値のうち、指定点数を超過してるビットはみないやうな、そのやうなインタフェースをのぞむのか?という質問です! ただ、慣例的なシーケンサープログラマは、ビットたち下げに、wandやworを使用されておりますので、 彼らの水準に準拠すれば、ヘキサで書き込む、バイトまたはイント配列のインタフェースで、かつ、指定点数超過分 はみないというやうな実装がよいかなあ?と思た次第てございます アルコール大量摂取でまとまらない文章でたいへん申し訳ございません

  • lumiheart
  • ベストアンサー率47% (1097/2289)
回答No.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プロトコルと大差ないと思うけど?

noname#235633
質問者

お礼

回答ありがとうございます。 えっとですね、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で書き込ませて処理させるほうが無難でしょうか???

関連するQ&A

  • MCプロトコル 1ビットだけONしたいとき

    お疲れ様です。 現在MCプロトコル通信アプリを作成しておりましてワード単位書き込みはできております。 文字列で連結させてアスキー変換する方法ではなく、 純粋にバイト配列を作って入れ込んでSocket の Write, Read をやる方法をとっております。 MELSECプロトコルマニュアルをみたのですが、 ビット単位書き込みのときは、データ列をビット列で並べるだけ、という解釈しかできません。 たとえば1ビットだけONしたいときは、バイト配列に書き込むやりかただと、どういう値を書き込めばよいのでしょうか。 &H1 (0x01) という値を書き込んでも何もなりません。 やはり文字列連結からASCII変換して送るやりかたのほうが賢明なのでしょうか? ご教授いただければ幸いです。。

  • DLL(コンポーネント)の読み込み方法

    VisualBasicでわからない点がありましたので質問します。 WiimoteLib.dllというコンポーネントファイルがあるのですが、それを読み込んでいろんな関数を使いたいのですが、それを読み込む方法がわかりません…。 ============================== ■開発環境 OS:Vista XP VBバージョン:Microsoft Visual Basic 2008 Express Edition ============================== 質問の仕方が悪いかもしれません…、理解できる方は教えてくださるとうれしいです。 よろしくお願いします。 また、不足した情報についてはまた指摘してください、追記したいとおもいます。

  • pic32mxのデータ幅

    初めてPIC32MXでプログラムを走らせようとしています。 MPLAB X IDEとXC32を使っています。 PIC18F等の8ビットCPUの経験はあります。 PIC32MXはアドレス幅32ビットデータ幅32ビットだと思ってプログラムを作り始めました。 デバックするところになって分からないことが出てきました。 XC32におけるint型のデータ幅は32ビット、unsigned char型は8ビットです。 プログラムで変数を定義するとunsigned char型は偶数アドレス、奇数アドレスそれぞで定義されます。 int型の配列を定義すると、偶数番地アドレスを先頭として4バイト単位で割り当てられます。 これは、PIC32MXがバイトアドレッシングCPUで4バイトアライメントということだと思います。(違ったらご指摘下さい。) 実際MPLAB X IDEでデータメモリを参照すると1アドレス1バイトデータで表示されます。 質問は、 PIC32MXは32ビットアドレス空間(実際に持っているROM、RMAサイズは別として) のCPUではあるが、メモリ幅は、8ビットというのではないだろうか? というものです。PIC32MXの内部レジスタ関連は32ビットなので32ビットCPUだとは思いますが、データシートにある「 32 ビットのネイティブデータ幅」という意味がわかりません。 実際のメモリ空間は、アドレス範囲 x 8ビットということでいいのでしょうか。 御教授いただけましたら幸いです。

  • C++ ビット演算

    ビット単位でのフラグ管理の方法を調べています。 その上で何点か疑問が出てきましたので質問させて頂きます。 ・10進数を2進数に変換する方法は2で割って余りを並べていくというものですが、別なやり方(標準関数など)はないのでしょうか。 ・unsigned char EightFlag = NULL; と = 0 は同じ意味でしょうか。 ・「a |= b」、「a ^= b」、「a ~= b」 と記述した場合、それぞれどのような判定が行われているのでしょうか。(真理値表というものをみたのですが意味がよくわかりませんでした) 以上です。 回答よろしくお願いします。

  • C++からC#のdllを参照する際、引数内に構造体があった場合の処理

    いつもお世話になっております。 http://satoshi.web5.jp/memo/connect_dll.htm VC++2008のMFCプロジェクトにて、C#のdllの関数を扱いたく、 上記サイトを参考に実装してみました。 上記サイトでも挙げているように、C#dll内の関数の引数が、 整数・文字列の場合は、うまく動作するのですが、 引数に構造体を渡し、dllにて構造体のデータを設定してやる関数にて、 引数の構造体ポインタを、どのように渡してやれば良いのかが 分かりません。 具体的には、 VARIANTARGの配列をnewし(変数pVarg)、 pVargに型と変数をセットして、Invoke関数に渡しますが、 その際の、pVargにセットしてやる型が分かりません。 このような場合は、どうすれば良いのでしょう? よろしくお願いします。

  • RGB32とYV12のビット深度、チャネル数、インターリーブについて。

    RGB32とYV12のビット深度、チャネル数、インターリーブについて。 この度プログラム上で(vc++)映像回転を行うこととなりました。 IntelIPPに都合の良さそうな関数があったため使用したいのですが、 ビット深度、チャネル数、インターリーブ/非インターリーブ(離散プレーン)によって 使用する関数が異なるため実装につまづいている状態で、 元々無知な上に忙しく調べる時間を取れないため、ビット深度等の言葉の意味は調べられても 具体的にRGB32またはYV12の場合の値はどうなのか?となるとさっぱり分かりません。 RGB32またはYV12のビット深度、チャネル数、インターリーブ/非インターリーブ(離散プレーン)についてご存じの方がおりましたら教えて頂けないでしょうか? 目標点はRGB32またはYV12の映像データの少なくとも一方に対する90/180/270度回転の実現です。

  • jQueryでセレクトボックスの制御

    自身のウェブサイト上のhtmlファイル内に複数選択型のセレクトボックスを、<select multiple="multiple">以下に<option value="XXX">を通し番号をつけて並列することで実装したとします。 jQueryにて例えば var a= [001, 003, 042]; といったように配列aを定義したときこの配列の中の要素(3桁の数字)に対応するようなvalueをもつoption(選択肢)をselectedに書き換えたいのですが初学者のためどうもさっぱりうまく行きません。 1.配列aをoptionタグのvalueの値であるとjQuery側に認識させる方法 2.jQueryによって配列に対応するvalueを持つoptionをselectedに書き換える方法 以上の2点について教えていただきたく思います。(説明が下手で申し訳ないです。) 配列を使わなくてももっと簡単な方法があるのかもしれませんが、諸事情によりなんとか配列を用いて実装できたらと思います。よろしくお願いします。

  • CDの正確な容量

    CDやDVDの容量が知りたいです。 8cm:200MB、12cm:650/700MB、DVD:4.7GB といいますが、ビット単位まで正確にその値なのでしょうか? また、MBやGBの基準も分かりません。10^6、10^9なのか2^100、2^1000なのか。 また、1バイトの狂いもなくCDサイズぴったりのファイルがあったとして、それはCDに確実に焼けますか? メディアの質の悪さゆえに書き込みにスペースを多く必要とするなどということはないでしょうか。

  • VB6でバイナリ互換でDLL作成するには?

    VB6.0にてActiveX DLLで開発をしたいのですが、 プロジェクトのプロパティ.コンポーネントにてバイナリ互換を選択すると バージョン互換コンポーネントを設定できません。というエラーメッセージが出て、 DLLを作成できません。 プロジェクトはフォーム1画面、標準モジュール複数、クラスモジュールで構成されています。 DLL作成手順のアドバイスをお願いします。 もう1点、 ある程度、開発できたら単体テストを行います。 その際は現場で用意されているテスト起動画面を使用するように言われたのですが、 この方法だと自分の担当画面に修正を加えるたびに下記1~3の作業を行う 必要があると思うのですが、もっとスマートな方法はないのでしょうか? 1.修正したプロジェクトを保存してdllを作成する。 2.作成したdllを所定の場所(現場で指示された場所)に格納 3.テスト起動画面からそのdllを指定して単体テスト

  • 処理速度を早くしたい!

    このサイトは初めてなので、至らない点があればお許しを。 画像処理ソフト(そこそこ本格的なもの)を開発したら、 処理速度が遅すぎる!(>.<)★←解決したい内容 (プラットフォームは64bit-QuadコアPCで、OSはvista) (Visual Studio 2005 C++で開発) この原因はたぶん、  1)なんと実メモリ占有が、5.6GBも(実装8GB)    (残りメモリが数10MBしか余裕がないようだ)  2)HDDへのアクセスが1分間に300~1100回発生している つまり残りメモリが少ないので、ページングしているからか? または処理プログラムをDLLにしたから、HDDに頻繁にアクセス? そこで、★質問A) 何にメモリをとられているか、分かるツールはないか? そしてこの配列にこれだけ、とかを、大きい順に見れるような… さらに、★質問B) もしDLLにしたのが問題であるなら、 DLLを実メモリに一旦展開したら、ずっと常駐して、 HDDへのアクセスが不要になるようなビルド方法があるらしい? ついでに、★質問C) 高速化のため一部並列threadプログラムでコーディングしたが、 使い難いので一部openMPを使ったが、逆に極端に遅くなった。 もちろん競合しないようにしたつもりだけど、 そもそもthreadPGとopenMPは共存できないの? ちなみに私くしめ、現役PGから退いて数年以上です。 最新の開発環境、その他用語など、知らない点も多し。 だから質問内容のピントがズレてるかもしれない (>.<) その点を同情して、このオジサンPGにやさしく教えてね♪ /E