質問編集履歴

1

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

2018/06/19 11:37

投稿

dashi
dashi

スコア14

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,271 @@
1
+ ### dodox86さん、coco_bauerさん、pepperleafさん ご指摘ありがとうございます。
2
+
3
+ 追加情報を添付させていただきます。
4
+
5
+
6
+
7
+ PC⇔シーケンサをRS-232ケーブルで接続し、デバイス(本件ではM)を読みだそうとしています。
8
+
9
+ ハンドシェイクについて、Handshake.None(※0)~Handshake.RequestToSendXOnXOff(※3) まで、
10
+
11
+ 全通り振ってみましたが、結果は変わりませんでした。
12
+
13
+
14
+
15
+ 尚、問題なく送受信できるTeraTerm上の設定は、
16
+
17
+ 以下の通りとなりWondowsFormアプリで設定した内容と同じと考えております。
18
+
19
+ ボーレート :115200
20
+
21
+ データ :8bit
22
+
23
+ パリティ :odd
24
+
25
+ ストップ(s):1bit
26
+
27
+ フロー制御 :none
28
+
29
+
30
+
31
+ C#のソースコードを添付します。
32
+
33
+ ```C#
34
+
35
+ ★シリアル通信設定→送信→受信読み込み部分
36
+
37
+ SerialPortContorl seriIns_plc = new SerialPortContorl();
38
+
39
+ int ret = seriIns_plc.Open_plc("COM19"); ★シリアル通信設定
40
+
41
+ if (Program.DefinedValue.PORT_OPEN != ret)
42
+
43
+ {
44
+
45
+ /* Open失敗 */
46
+
47
+ seriIns_plc.Close();
48
+
49
+ seriIns_plc.Dispose();
50
+
51
+ seriIns_plc = null;
52
+
53
+ return;
54
+
55
+ }
56
+
57
+ seriIns_plc.sendCmd_plc();
58
+
59
+ for (;;) {
60
+
61
+ System.Threading.Thread.Sleep(1000);
62
+
63
+ Console.WriteLine("{0}", seriIns_plc.BytesToRead); ★ここで受信サイズを参照するも4しかでない
64
+
65
+ if (seriIns_plc.BytesToRead > 0)
66
+
67
+ {
68
+
69
+ byte data = (byte)seriIns_plc.ReadByte(); ★受信部分
70
+
71
+ Console.WriteLine("recv:{0}", data);
72
+
73
+ }
74
+
75
+ }
76
+
77
+
78
+
79
+ ★通信設定部分
80
+
81
+ public int Open_plc(string portName)
82
+
83
+ {
84
+
85
+ try
86
+
87
+ {
88
+
89
+ PortName = portName;
90
+
91
+ BaudRate = 115200;
92
+
93
+ DataBits = 8;
94
+
95
+ Parity = Parity.Odd;
96
+
97
+ StopBits = StopBits.One;
98
+
99
+ //Encoding = Encoding.UTF8;
100
+
101
+ //NewLine = "\r\n";
102
+
103
+
104
+
105
+ Encoding = Encoding.GetEncoding("shift_jis");
106
+
107
+ Handshake = Handshake.None;
108
+
109
+
110
+
111
+ Open();
112
+
113
+
114
+
115
+ ret = Program.DefinedValue.PORT_OPEN;
116
+
117
+ }
118
+
119
+ catch
120
+
121
+ {
122
+
123
+ }
124
+
125
+ return 0;
126
+
127
+ }
128
+
129
+
130
+
131
+ //*******************************************
132
+
133
+ // MCプロトコル
134
+
135
+ //*******************************************
136
+
137
+ static public byte PLC_SEND_CTLCODE_ENQ = 0x05;
138
+
139
+ static public string PLC_SEND_FRAMENO_4C = "F8";
140
+
141
+ static public string PLC_SEND_ADDRESSNO = "00";
142
+
143
+ static public string PLC_SEND_NETWORKNO = "00";
144
+
145
+ static public string PLC_SEND_PCNO = "FF";
146
+
147
+ static public string PLC_SEND_UNITIO = "03FF";
148
+
149
+ static public string PLC_SEND_UNITNO = "00";
150
+
151
+ static public string PLC_SEND_UNITADR = "00";
152
+
153
+
154
+
155
+ static public string PLC_SEND_READ_CMD = "0401";
156
+
157
+ static public string PLC_SEND_SUB_CMD = "0000";
158
+
159
+ static public string PLC_SEND_READ_DNO = "003062";
160
+
161
+ static public string PLC_SEND_MCODE = "M*";
162
+
163
+
164
+
165
+ ★データ送信部分
166
+
167
+ public void sendCmd_plc()
168
+
169
+ {
170
+
171
+ byte[] convByte = new byte[1024];
172
+
173
+ byte[] sendByte = new byte[1024];
174
+
175
+ StringBuilder sendStr = new StringBuilder();
176
+
177
+
178
+
179
+ sendStr.Append(PLC_SEND_FRAMENO_4C); //F8
180
+
181
+ sendStr.Append(PLC_SEND_ADDRESSNO); //00
182
+
183
+ sendStr.Append(PLC_SEND_NETWORKNO); //00
184
+
185
+ sendStr.Append(PLC_SEND_PCNO); //FF
186
+
187
+ sendStr.Append(PLC_SEND_UNITIO); //03FF
188
+
189
+ sendStr.Append(PLC_SEND_UNITNO); //00
190
+
191
+ sendStr.Append(PLC_SEND_UNITADR); //00
192
+
193
+ sendStr.Append(PLC_SEND_READ_CMD); //0401
194
+
195
+ sendStr.Append(PLC_SEND_SUB_CMD); //0000
196
+
197
+ sendStr.Append(PLC_SEND_MCODE); //M*
198
+
199
+ sendStr.Append(PLC_SEND_READ_DNO); //003062
200
+
201
+ sendStr.Append("0005"); //デバイス点数(5点)
202
+
203
+
204
+
205
+ convByte = Encoding.UTF8.GetBytes(sendStr.ToString());
206
+
207
+ byte chkSum = 0;
208
+
209
+ foreach(byte byteUnit in convByte)
210
+
211
+ {
212
+
213
+ chkSum += byteUnit;
214
+
215
+ }
216
+
217
+ byte[] chksum_4bit= { 0, 0 };
218
+
219
+ chksum_4bit[0] = (byte)(chkSum >> 4);
220
+
221
+ chksum_4bit[1] = (byte)(chkSum & 0xF);
222
+
223
+
224
+
225
+ byte sendDataSize = 0;
226
+
227
+ sendByte[0] = PLC_SEND_CTLCODE_ENQ;
228
+
229
+ sendDataSize++;
230
+
231
+ foreach (var byteUnit in convByte.Select((value,idx) => new { value, idx }))
232
+
233
+ {
234
+
235
+ sendByte[1 + byteUnit.idx] = byteUnit.value;
236
+
237
+ sendDataSize++;
238
+
239
+ }
240
+
241
+ sendByte[sendDataSize] = btoa(chksum_4bit[0]);
242
+
243
+ sendDataSize++;
244
+
245
+ sendByte[sendDataSize] = btoa(chksum_4bit[1]);
246
+
247
+ sendDataSize++;
248
+
249
+ sendByte[sendDataSize] = 0x0D;
250
+
251
+ sendDataSize++;
252
+
253
+ sendByte[sendDataSize] = 0x0A;
254
+
255
+ sendDataSize++;
256
+
257
+
258
+
259
+ Write(sendByte, 0, sendDataSize); ★sendByteに格納されたデータをTeraTermから送信すると問題ない
260
+
261
+ }
262
+
263
+ ```
264
+
265
+
266
+
267
+
268
+
1
269
  ### 問題事項
2
270
 
3
271
  現在、デバイス(M3062)に対してシリアル通信(RS-232)にて一括読み出し操作を実施しているが、