C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

文字をhexにしてPLCに送る

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■101964 / inTopicNo.1)  文字をhexにしてPLCに送る
  
□投稿者/ たかし (5回)-(2023/05/22(Mon) 17:32:58)

分類:[C#] 

宜しくお願い致します
C# windows フォームアプリケーション.NET Framework

textBox1に入力された10文字以内の文字をPLCに送りたいと思っているのですが

string sendMessage;
string kanji = textBox1.text;
Encoding shiftJISEncoding = Encoding.GetEncoding("shift_jis");
byte[] shiftJISBytes = shiftJISEncoding.GetBytes(kanji);
string hexstring = BitConverter.ToString(shiftJISBytes).Replace("-", "");

上記で変換すると
hexstringの中身は下記になりました
82A082A282A482A682A882A982AB82AD82AF82B1

ただ転送するのにスペースを入れないと出来ない様で
82A0 82A2 82A4 82A6 82A8 82A9 82AB 82AD 82AF 82B1
としたいのですがどの様にすればいいでしょうか

又文字が無い所は0にしないとエラーになってしまいますが
文字のない所に0を入れるにはどうしたらいいでしょうか
宜しくお願い致します

引用返信 編集キー/
■101965 / inTopicNo.2)  Re[1]: 文字をhexにしてPLCに送る
□投稿者/ 伝説のカレー (106回)-(2023/05/22(Mon) 19:30:05)
No101964 (たかし さん) に返信

> ただ転送するのにスペースを入れないと出来ない様で
> 82A0 82A2 82A4 82A6 82A8 82A9 82AB 82AD 82AF 82B1
> としたいのですがどの様にすればいいでしょうか

1文字ずつ変換して結合する感じでいんじゃないですかね

var kanji = "あいうえおかきくけこ";
var sjis = Encoding.GetEncoding("Shift_JIS");

var xs = kanji
	.Select(x => x.ToString())
	.Select(x => sjis.GetBytes(x))
	.Select(x => BitConverter.ToString(x))
	.Select(x => x.Replace("-", ""));

Console.WriteLine(string.Join(" ", xs));

> 又文字が無い所は0にしないとエラーになってしまいますが
> 文字のない所に0を入れるにはどうしたらいいでしょうか

文字列が入力されてそれを送るわけですよね
文字のないところってどういうところですか?
Shift_JISに変換できない文字ってことですか?

引用返信 編集キー/
■101966 / inTopicNo.3)  Re[1]: 文字をhexにしてPLCに送る
□投稿者/ furu (208回)-(2023/05/22(Mon) 19:47:24)
No101964 (たかし さん) に返信
どのあたりで困っているのでしょうか?
いくらでもやりようあると思います。

hexstring = hexstring + new string('0', 10 * 4 - hexstring.Length); //"0000"追加(全角10文字想定)

for (var i = 4; i < hexstring.Length; i += 5)  //4文字おきに
  hexstring = hexstring.Insert(i, " ");        //スペース追加

引用返信 編集キー/
■101968 / inTopicNo.4)  Re[2]: 文字をhexにしてPLCに送る
□投稿者/ たかし (6回)-(2023/05/22(Mon) 21:10:42)
No101966 (furu さん) に返信
> ■No101964 (たかし さん) に返信

伝説のカレーさん furuさん ありがとうございます

困っている所は
送信コマンド sendMessage = "WRS DM100.H 10 "+ hexstring + '\r';
10文字送るようにしてしまっているので
6文字の時、残り4文字分まで無理やり0を入れてやらないといけないので
本当は文字分だけ送れればいいなと思っています
引用返信 編集キー/
■101969 / inTopicNo.5)  Re[3]: 文字をhexにしてPLCに送る
□投稿者/ Azulean (1274回)-(2023/05/23(Tue) 07:21:38)
No101968 (たかし さん) に返信
> 送信コマンド sendMessage = "WRS DM100.H 10 "+ hexstring + '\r';
> 10文字送るようにしてしまっているので
> 6文字の時、残り4文字分まで無理やり0を入れてやらないといけないので
> 本当は文字分だけ送れればいいなと思っています


「したい」かつ「できる」なら「そうすれば良い」。10 と書いているから 10 文字送るのはあなたの都合だからです。

ただし、ラダーや PLC、その先の制御対象の機器が 0 で埋めることを前提にしている場合は、「したい」と思っていても「できる」を満たさないので諦めるしかないでしょう。
たとえば、0 終端が前提なら、6 文字のときは少なくとも 1 文字は余分に送らないといけないなど。

そういった前提や環境の詳細を知らない第三者に「できればいいなと思っています」と言われても、まず、前提はどうなんですか?という質問者自身が確認すべきことが出てきます。
引用返信 編集キー/
■101970 / inTopicNo.6)  Re[3]: 文字をhexにしてPLCに送る
□投稿者/ kiku (347回)-(2023/05/23(Tue) 08:48:27)
No101968 (たかし さん) に返信
> ■No101966 (furu さん) に返信
>>■No101964 (たかし さん) に返信
>
> 伝説のカレーさん furuさん ありがとうございます
>
> 困っている所は
> 送信コマンド sendMessage = "WRS DM100.H 10 "+ hexstring + '\r';
> 10文字送るようにしてしまっているので
> 6文字の時、残り4文字分まで無理やり0を入れてやらないといけないので
> 本当は文字分だけ送れればいいなと思っています

上記のコマンドはキーエンス製PLCのコマンドですね。
下記の文字列を送りたい場合、
 82A0 82A2 82A4 82A6 82A8 82A9 82AB 82AD 82AF 82B1

ちょうど10バイトなので、下記コマンドを送信することになります。
"WRS DM100.H 10 82A0 82A2 82A4 82A6 82A8 82A9 82AB 82AD 82AF 82B1" + '\r'

文字列が短く9バイトの場合には、
下記パターン1かパターン2になると思います。
パターン1
"WRS DM100.H 9 82A0 82A2 82A4 82A6 82A8 82A9 82AB 82AD 82AF" + '\r'
パターン2
"WRS DM100.H 10 82A0 82A2 82A4 82A6 82A8 82A9 82AB 82AD 82AF 0000" + '\r'

上記のように、0000で埋める意味があるかどうかは
PLC側のプログラマに聞いた方が良いです。
必ず0000で埋めて欲しい場合の方がおそらく多いと思います。

引用返信 編集キー/
■101973 / inTopicNo.7)  Re[3]: 文字をhexにしてPLCに送る
□投稿者/ 伝説のカレー (107回)-(2023/05/23(Tue) 10:46:25)
なるほどなるほど

> 文字のない所に0を入れるにはどうしたらいいでしょうか

var kanji = "あいうえおかき";
var sjis = Encoding.GetEncoding("Shift_JIS");

var xs = kanji
	.Select(x => x.ToString())
	.Select(x => sjis.GetBytes(x))
	.Select(x => BitConverter.ToString(x))
	.Select(x => x.Replace("-", ""))
	.Concat(Enumerable.Repeat("0000", 10 - kanji.Length));

Console.WriteLine(string.Join(" ", xs));

こんなやり方もできそうな気がします

引用返信 編集キー/
■101978 / inTopicNo.8)  Re[4]: 文字をhexにしてPLCに送る
□投稿者/ たかし (7回)-(2023/05/23(Tue) 15:14:06)
できました
皆さん、ご丁寧委に説明頂きありがとうございました

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ