西门子FETCH/WRITE service
slave=0 adr=192.168.1.99 type=S7_1200 fetch_write=0 function=1 rack_slot=0
在pvbrowser里设置与PLC连接的时候有一项fetch_write,下面具体看一下这一项
rlSiemensTcp源码
446 if((plc_type == S5 || plc_type == S7_300 || plc_type == S7_400) && fetch_write == 1)
447 {
448 length = sizeof(ih) + sizeof(fh);
449 ih.version = 3;
450 ih.reserved = 0;
451 ih.length_high = length / 256;
452 ih.length_low = length & 0x0ff;
453 fh.ident[0] = 'S';
454 fh.ident[1] = '5';
455 fh.header_len = 16;
456 fh.ident_op_code = 1;
457 fh.op_code_len = 3;
458 fh.op_code = 5;
459 fh.ident_org_block = 3;
460 fh.len_org_block = 8;
461 fh.org_block = (unsigned char) org;
462 fh.dbnr = (unsigned char) dbnr;
463 fh.start_adr[0] = (unsigned char) start_adr / 256;
464 fh.start_adr[1] = (unsigned char) start_adr & 0x0ff;;
465 fh.len[0] = (unsigned char) len / 256;
466 fh.len[1] = (unsigned char) len & 0x0ff;;
467 fh.spare1 = 0x0ff;
468 fh.spare1_len = 2;
469 unsigned char total_buf[sizeof(ih)+sizeof(fh)];
470 memcpy(total_buf, &ih, sizeof(ih));
471 memcpy(total_buf+sizeof(ih), &fh, sizeof(fh));
472 ret = rlSocket::write(total_buf, sizeof(ih)+sizeof(fh));
473 rlDebugPrintf("fetch write ih ret=%d\n",ret);
474 if(ret < 0) return ret;
475 /*
476 ret = rlSocket::write(&i