📄 modbus.lst
字号:
196 1 sendBuf[byteCount] = crcData >> 8;
197 1 byteCount++;
198 1 sendBuf[byteCount] = crcData & 0xff;
199 1
200 1 sendCount = byteCount + 1;
201 1 beginSend();
202 1 }//void readRegisters(void)
*** WARNING C280 IN LINE 166 OF MODBUS.C: 'result': unreferenced local variable
*** WARNING C280 IN LINE 170 OF MODBUS.C: 'finsh': unreferenced local variable
203
204
205 //强制单个线圈
206 void forceSingleCoil(void)
207 {
208 1 uint8 addr;
209 1 uint8 tempAddr;
210 1 uint16 tempData;
211 1 uint8 onOff;
212 1 uint8 i;
213 1
214 1 //addr = (receBuf[2]<<8) + receBuf[3];
215 1 //tempAddr = addr & 0xfff;
216 1 addr = receBuf[3];
217 1 tempAddr = addr;
218 1
219 1 //onOff = (receBuf[4]<<8) + receBuf[5];
220 1 onOff = receBuf[4];
221 1
222 1 //if(onOff == 0xff00)
223 1 if(onOff == 0xff)
224 1 { //设为ON
225 2 tempData = 1;
226 2 }
227 1 //else if(onOff == 0x0000)
228 1 else if(onOff == 0x00)
229 1 { //设为OFF
230 2 tempData = 0;
231 2 }
232 1
233 1 setCoilVal(tempAddr,tempData);
234 1
235 1 for(i=0;i<receCount;i++)
236 1 {
237 2 sendBuf[i] = receBuf[i];
238 2 }
C51 COMPILER V7.06 MODBUS 03/16/2005 16:48:06 PAGE 5
239 1 sendCount = receCount;
240 1 beginSend();
241 1 }//void forceSingleCoil(void)
242
243
244 //设置多个寄存器
245 void presetMultipleRegisters(void)
246 {
247 1 uint8 addr;
248 1 uint8 tempAddr;
249 1 uint8 byteCount;
250 1 uint8 setCount;
251 1 uint16 crcData;
252 1 uint16 tempData;
253 1 uint8 finsh; //为1时完成 为0时出错
254 1 uint8 i;
255 1
256 1 //addr = (receBuf[2]<<8) + receBuf[3];
257 1 //tempAddr = addr & 0xfff;
258 1 addr = receBuf[3];
259 1 tempAddr = addr & 0xff;
260 1
261 1 //setCount = (receBuf[4]<<8) + receBuf[5];
262 1 setCount = receBuf[5];
263 1 byteCount = receBuf[6];
264 1
265 1 for(i=0;i<setCount;i++,tempAddr++)
266 1 {
267 2 tempData = (receBuf[i*2+7]<<8) + receBuf[i*2+8];
268 2
269 2 setRegisterVal(tempAddr,tempData);
270 2 }
271 1
272 1 sendBuf[0] = localAddr;
273 1 sendBuf[1] = 16;
274 1 sendBuf[2] = addr >> 8;
275 1 sendBuf[3] = addr & 0xff;
276 1 sendBuf[4] = setCount >> 8;
277 1 sendBuf[5] = setCount & 0xff;
278 1 crcData = crc16(sendBuf,6);
279 1 sendBuf[6] = crcData >> 8;
280 1 sendBuf[7] = crcData & 0xff;
281 1 sendCount = 8;
282 1 beginSend();
283 1 }//void presetMultipleRegisters(void)
*** WARNING C280 IN LINE 253 OF MODBUS.C: 'finsh': unreferenced local variable
284
285
286
287 //检查uart0数据
288 void checkComm0Modbus(void)
289 {
290 1 uint16 crcData;
291 1 uint16 tempData;
292 1
293 1 if(receCount > 4)
294 1 {
295 2 switch(receBuf[1])
296 2 {
297 3 case 1://读取线圈状态(读取点 16位以内)
298 3 case 3://读取保持寄存器(一个或多个)
299 3 case 5://强制单个线圈
C51 COMPILER V7.06 MODBUS 03/16/2005 16:48:06 PAGE 6
300 3 case 6://设置单个寄存器
301 3 if(receCount >= 8)
302 3 {//接收完成一组数据
303 4 //应该关闭接收中断
304 4
305 4 if(receBuf[0]==localAddr && checkoutError==0)
306 4 {
307 5 crcData = crc16(receBuf,6);
308 5 if(crcData == receBuf[7]+(receBuf[6]<<8))
309 5 {//校验正确
310 6 if(receBuf[1] == 1)
311 6 {//读取线圈状态(读取点 16位以内)
312 7 readCoil();
313 7 }
314 6 else if(receBuf[1] == 3)
315 6 {//读取保持寄存器(一个或多个)
316 7 readRegisters();
317 7 }
318 6 else if(receBuf[1] == 5)
319 6 {//强制单个线圈
320 7 forceSingleCoil();
321 7 }
322 6 else if(receBuf[1] == 6)
323 6 {
324 7 //presetSingleRegister();
325 7 }
326 6
327 6 }
328 5 }
329 4 receCount = 0;
330 4 checkoutError = 0;
331 4 }
332 3 break;
333 3
334 3 case 15://设置多个线圈
335 3 tempData = receBuf[6];
336 3 tempData += 9; //数据个数
337 3 if(receCount >= tempData)
338 3 {
339 4 if(receBuf[0]==localAddr && checkoutError==0)
340 4 {
341 5 crcData = crc16(receBuf,tempData-2);
342 5 if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
343 5 {
344 6 //forceMultipleCoils();
345 6 }
346 5 }
347 4 receCount = 0;
348 4 checkoutError = 0;
349 4 }
350 3 break;
351 3
352 3 case 16://设置多个寄存器
353 3 tempData = (receBuf[4]<<8) + receBuf[5];
354 3 tempData = tempData * 2; //数据个数
355 3 tempData += 9;
356 3 if(receCount >= tempData)
357 3 {
358 4 if(receBuf[0]==localAddr && checkoutError==0)
359 4 {
360 5 crcData = crc16(receBuf,tempData-2);
361 5 if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
C51 COMPILER V7.06 MODBUS 03/16/2005 16:48:06 PAGE 7
362 5 {
363 6 presetMultipleRegisters();
364 6 }
365 5 }
366 4 receCount = 0;
367 4 checkoutError = 0;
368 4 }
369 3 break;
370 3
371 3 default:
372 3 break;
373 3 }
374 2 }
375 1 }//void checkComm0(void)
376
377 //取线圈状态 返回0表示成功
378 uint16 getCoilVal(uint16 addr,uint16 *tempData)
379 {
380 1 uint16 result = 0;
381 1 uint16 tempAddr;
382 1
383 1 tempAddr = addr & 0xfff;
384 1 //只取低8位地址
385 1 switch(tempAddr & 0xff)
386 1 {
387 2 case 0:
388 2 break;
389 2 case 1:
390 2 *tempData = testCoil;
391 2 break;
392 2 case 2:
393 2 break;
394 2 case 3:
395 2 break;
396 2 case 4:
397 2 break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -