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

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

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

Re[5]: PLC データメモリ ASCIIに変換


(過去ログ 177 を表示中)

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

■101868 / inTopicNo.1)  PLC データメモリ ASCIIに変換
  
□投稿者/ たかし (1回)-(2023/05/02(Tue) 15:11:11)

分類:[C#] 

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

今パソコンとKEYENCE PLCを繋いでDM(データメモリ)を読ませるプログラムを作っています


string sendMsg = "RDS D813.D 1"+'\r';

上記で"0012345678"の文字はとれました


string sendMsg = "RD D810.U 2"+'\r';で読ませていますが中身が

D810 =10進数16bit で"16706" =ASCIIなら"AB"
D811 =10進数16bit で"17220" =ASCIIなら"CD" なんですが "ABCD" と表示させたいのですが
どう書けばよろしいでしょうか



引用返信 編集キー/
■101869 / inTopicNo.2)  Re[1]: PLC データメモリ ASCIIに変換
□投稿者/ Azulean (1272回)-(2023/05/02(Tue) 15:22:00)
No101868 (たかし さん) に返信
> D810 =10進数16bit で"16706" =ASCIIなら"AB"
> D811 =10進数16bit で"17220" =ASCIIなら"CD" なんですが "ABCD" と表示させたいのですが
> どう書けばよろしいでしょうか


1. byte 配列に変換する
"16706" が文字列で手に入っているのなら、ushort.Parse で ushort 型にして、BitConverter.GetBytes で byte 配列とする。
 それら 2 つの byte 配列をつなげる。

2. Encoding.ASCII.GetString につなげた byte 配列を渡す。


というところです。
それぞれ調べてみてください。
引用返信 編集キー/
■101870 / inTopicNo.3)  Re[2]: PLC データメモリ ASCIIに変換
□投稿者/ たかし (2回)-(2023/05/02(Tue) 18:30:39)
No101869 (Azulean さん) に返信

ありがとうございます
調べてみます
引用返信 編集キー/
■101872 / inTopicNo.4)  Re[3]: PLC データメモリ ASCIIに変換
□投稿者/ たかし (3回)-(2023/05/03(Wed) 08:41:19)
> ■No101869 (Azulean さん) に返信
> 
> ありがとうございます。できました

for (i = 0; i < 2; i++)
{
ushort number = ushort.Parse(resMsg);
byte[] byteArray=BitConverter.GetBytes(number);
Array.Reverse(byteArray);
string str = Encoding.ASCII.GetString(byteArray);
numb[i] = str;       
}
string name = numb[0] + numb[1];   
  
こんな感じになりました

あと1つお聞きしたいのですが
nameの中身が 1文字とあと\0\0\0 か 2文字と\0\0 か 3文字と\0 の時があるのですが
\0を取り除きたい時はどうしたらいいでしょうか


引用返信 編集キー/
■101878 / inTopicNo.5)  Re[4]: PLC データメモリ ASCIIに変換
□投稿者/ Azulean (1273回)-(2023/05/03(Wed) 18:06:09)
No101872 (たかし さん) に返信
> あと1つお聞きしたいのですが
> nameの中身が 1文字とあと\0\0\0 か 2文字と\0\0 か 3文字と\0 の時があるのですが
> \0を取り除きたい時はどうしたらいいでしょうか

できた String に対して TrimEnd('\0') と呼んであげれば良いです。


name = name.TrimEnd('\0');


ところで。

> for (i = 0; i < 2; i++)
> {
>   ushort number = ushort.Parse(resMsg);
>   byte[] byteArray=BitConverter.GetBytes(number);
>   Array.Reverse(byteArray);
>   string str = Encoding.ASCII.GetString(byteArray);
>   numb[i] = str;       
> }
> string name = numb[0] + numb[1];   


ループ内の ushort.Parse(resMsg) はこの例だと i が 0 でも 1 でも同じものを使ってしまっていそうですが、
この掲示板に差し障りない内容に書き直す際に間違えたということで良いですよね…?

あと、ASCII の間はこれでも支障なさそうですが、Shift_JIS などのマルチバイト文字列を扱うようになるなら、
毎回 GetString するのではなく、すべての byte 配列をつなげてから GetString する必要があります。
ご注意ください。

LINQ になじめばこういう感じにできるとは思います。

// 受信した文字列を想定したダミー
var resMsg = new string[2] { "16706", "17220" };

// 受信した文字列配列をLINQでushort→bytes→逆順並べ替えして1つのbyte配列に連結
var bytes = resMsg
  .SelectMany(m => BitConverter.GetBytes(ushort.Parse(m)).Reverse())
  .ToArray();
// byte配列をASCIIで文字列変換して、終端文字を削る
var result = Encoding.ASCII.GetString(bytes).TrimEnd('\0');

引用返信 編集キー/
■101892 / inTopicNo.6)  Re[5]: PLC データメモリ ASCIIに変換
□投稿者/ たかし (4回)-(2023/05/10(Wed) 17:57:21)
No101878 (Azulean さん) に返信

返信大変おそくなりまして申し訳ありません
できました
ありがとうございました
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -