teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

WindowsFromアプリのソースコードを添付します。

2018/06/19 11:37

投稿

dashi
dashi

スコア14

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,137 @@
1
+ ### dodox86さん、coco_bauerさん、pepperleafさん ご指摘ありがとうございます。
2
+ 追加情報を添付させていただきます。
3
+
4
+ PC⇔シーケンサをRS-232ケーブルで接続し、デバイス(本件ではM)を読みだそうとしています。
5
+ ハンドシェイクについて、Handshake.None(※0)~Handshake.RequestToSendXOnXOff(※3) まで、
6
+ 全通り振ってみましたが、結果は変わりませんでした。
7
+
8
+ 尚、問題なく送受信できるTeraTerm上の設定は、
9
+ 以下の通りとなりWondowsFormアプリで設定した内容と同じと考えております。
10
+ ボーレート :115200
11
+ データ :8bit
12
+ パリティ :odd
13
+ ストップ(s):1bit
14
+ フロー制御 :none
15
+
16
+ C#のソースコードを添付します。
17
+ ```C#
18
+ ★シリアル通信設定→送信→受信読み込み部分
19
+ SerialPortContorl seriIns_plc = new SerialPortContorl();
20
+ int ret = seriIns_plc.Open_plc("COM19"); ★シリアル通信設定
21
+ if (Program.DefinedValue.PORT_OPEN != ret)
22
+ {
23
+ /* Open失敗 */
24
+ seriIns_plc.Close();
25
+ seriIns_plc.Dispose();
26
+ seriIns_plc = null;
27
+ return;
28
+ }
29
+ seriIns_plc.sendCmd_plc();
30
+ for (;;) {
31
+ System.Threading.Thread.Sleep(1000);
32
+ Console.WriteLine("{0}", seriIns_plc.BytesToRead); ★ここで受信サイズを参照するも4しかでない
33
+ if (seriIns_plc.BytesToRead > 0)
34
+ {
35
+ byte data = (byte)seriIns_plc.ReadByte(); ★受信部分
36
+ Console.WriteLine("recv:{0}", data);
37
+ }
38
+ }
39
+
40
+ ★通信設定部分
41
+ public int Open_plc(string portName)
42
+ {
43
+ try
44
+ {
45
+ PortName = portName;
46
+ BaudRate = 115200;
47
+ DataBits = 8;
48
+ Parity = Parity.Odd;
49
+ StopBits = StopBits.One;
50
+ //Encoding = Encoding.UTF8;
51
+ //NewLine = "\r\n";
52
+
53
+ Encoding = Encoding.GetEncoding("shift_jis");
54
+ Handshake = Handshake.None;
55
+
56
+ Open();
57
+
58
+ ret = Program.DefinedValue.PORT_OPEN;
59
+ }
60
+ catch
61
+ {
62
+ }
63
+ return 0;
64
+ }
65
+
66
+ //*******************************************
67
+ // MCプロトコル
68
+ //*******************************************
69
+ static public byte PLC_SEND_CTLCODE_ENQ = 0x05;
70
+ static public string PLC_SEND_FRAMENO_4C = "F8";
71
+ static public string PLC_SEND_ADDRESSNO = "00";
72
+ static public string PLC_SEND_NETWORKNO = "00";
73
+ static public string PLC_SEND_PCNO = "FF";
74
+ static public string PLC_SEND_UNITIO = "03FF";
75
+ static public string PLC_SEND_UNITNO = "00";
76
+ static public string PLC_SEND_UNITADR = "00";
77
+
78
+ static public string PLC_SEND_READ_CMD = "0401";
79
+ static public string PLC_SEND_SUB_CMD = "0000";
80
+ static public string PLC_SEND_READ_DNO = "003062";
81
+ static public string PLC_SEND_MCODE = "M*";
82
+
83
+ ★データ送信部分
84
+ public void sendCmd_plc()
85
+ {
86
+ byte[] convByte = new byte[1024];
87
+ byte[] sendByte = new byte[1024];
88
+ StringBuilder sendStr = new StringBuilder();
89
+
90
+ sendStr.Append(PLC_SEND_FRAMENO_4C); //F8
91
+ sendStr.Append(PLC_SEND_ADDRESSNO); //00
92
+ sendStr.Append(PLC_SEND_NETWORKNO); //00
93
+ sendStr.Append(PLC_SEND_PCNO); //FF
94
+ sendStr.Append(PLC_SEND_UNITIO); //03FF
95
+ sendStr.Append(PLC_SEND_UNITNO); //00
96
+ sendStr.Append(PLC_SEND_UNITADR); //00
97
+ sendStr.Append(PLC_SEND_READ_CMD); //0401
98
+ sendStr.Append(PLC_SEND_SUB_CMD); //0000
99
+ sendStr.Append(PLC_SEND_MCODE); //M*
100
+ sendStr.Append(PLC_SEND_READ_DNO); //003062
101
+ sendStr.Append("0005"); //デバイス点数(5点)
102
+
103
+ convByte = Encoding.UTF8.GetBytes(sendStr.ToString());
104
+ byte chkSum = 0;
105
+ foreach(byte byteUnit in convByte)
106
+ {
107
+ chkSum += byteUnit;
108
+ }
109
+ byte[] chksum_4bit= { 0, 0 };
110
+ chksum_4bit[0] = (byte)(chkSum >> 4);
111
+ chksum_4bit[1] = (byte)(chkSum & 0xF);
112
+
113
+ byte sendDataSize = 0;
114
+ sendByte[0] = PLC_SEND_CTLCODE_ENQ;
115
+ sendDataSize++;
116
+ foreach (var byteUnit in convByte.Select((value,idx) => new { value, idx }))
117
+ {
118
+ sendByte[1 + byteUnit.idx] = byteUnit.value;
119
+ sendDataSize++;
120
+ }
121
+ sendByte[sendDataSize] = btoa(chksum_4bit[0]);
122
+ sendDataSize++;
123
+ sendByte[sendDataSize] = btoa(chksum_4bit[1]);
124
+ sendDataSize++;
125
+ sendByte[sendDataSize] = 0x0D;
126
+ sendDataSize++;
127
+ sendByte[sendDataSize] = 0x0A;
128
+ sendDataSize++;
129
+
130
+ Write(sendByte, 0, sendDataSize); ★sendByteに格納されたデータをTeraTermから送信すると問題ない
131
+ }
132
+ ```
133
+
134
+
1
135
  ### 問題事項
2
136
  現在、デバイス(M3062)に対してシリアル通信(RS-232)にて一括読み出し操作を実施しているが、
3
137
  応答データがいくら待っても4byteしか受信できない。