extern struct results setplcmode (struct _comm comm1, byte plctype, byte plcmode, int debug) { struct ethernet_header header, rcvd; struct pccc_data df1_2; struct results result; struct custom_pccc custom; int hlen; bzero (&header,sizeof(header)); bzero (&rcvd, sizeof(rcvd)); header.mode = 1; header.submode = PCCC_CMD; header.conn = htonl(comm1.commid); custom.request_id = htonl(0xe87573); df1_2.src=0; df1_2.control=5; df1_2.dst=0; df1_2.lsap=0; df1_2.cmd=0x0f; df1_2.sts=0; df1_2.tns=htons(comm1.tns); switch (plctype) { case PLC5250: case PLC5: case MICRO: df1_2.fnc=0x3a; break; case SLC: df1_2.fnc=0x80; break; } df1_2.data[0]=plcmode; hlen = _ENET_HEADER_LEN+PCCC_DATA_LEN+1 ; memcpy (&header.df1_stuff, &df1_2, PCCC_DATA_LEN+1); header.pccc_length = htons(10); rcvd = senddf1 (comm1, header, hlen, debug); result.sts = rcvd.df1_stuff[5]; result.extsts = rcvd.df1_stuff[8]; if (rcvd.df1_stuff[4] != (df1_2.cmd + 0x40)) { result.sts = 255; } return result; }
extern struct results downloaddone (struct _comm comm1, int debug) { struct ethernet_header header, rcvd; struct pccc_normal df1_2; struct results result; struct custom_pccc custom; int hlen; bzero (&header,sizeof(header)); bzero (&rcvd, sizeof(rcvd)); header.mode = 1; header.submode = PCCC_CMD; header.conn = htonl(comm1.commid); custom.request_id = htonl(0xe87573); custom.name_id = 0; memcpy (&header.custom, &custom, _CUSTOM_LEN); df1_2.src=0; df1_2.control = 5; df1_2.dst=0; df1_2.lsap = 0; df1_2.cmd=0x0f; df1_2.sts=0; df1_2.tns=htons(comm1.tns); df1_2.fnc=0x52; hlen = _ENET_HEADER_LEN + PCCC_DATA_LEN;; memcpy (&header.df1_stuff, &df1_2, PCCC_DATA_LEN); header.pccc_length = htons(PCCC_DATA_LEN); rcvd = senddf1 (comm1, header, hlen, debug); result.sts = rcvd.df1_stuff[5]; result.extsts = rcvd.df1_stuff[8]; if (rcvd.df1_stuff[4] != (df1_2.cmd + 0x40)) result.sts = 255; return result; }
extern struct _data typed_write (struct _comm comm1, char *addr, int count, struct _data data, int plctype, int debug) { struct ethernet_header header,rcvd; struct pccc_word_read df1_1; struct _data retdata; struct namedata name; struct custom_pccc custom; int x,place,d,location,hlen; bzero (&header,sizeof(header)); bzero (&rcvd, sizeof(rcvd)); bzero (&retdata,sizeof(retdata)); header.mode = 1; header.submode = PCCC_CMD; header.conn = htonl(comm1.commid); custom.request_id = htonl(0xe87573); custom.name_id = 0; memcpy (&header.custom, &custom, _CUSTOM_LEN); df1_1.src=0; df1_1.control=5; df1_1.dst=0; df1_1.lsap=0; df1_1.cmd=0x0f; df1_1.sts=0; if (plctype == PLC5250) df1_1.tns = comm1.tns; if (plctype != PLC5250) df1_1.tns = htons(comm1.tns); df1_1.fnc=0x67; df1_1.offset = 0; name = nameconv5(addr,plctype,debug); for (x=0;x<name.len;x++) df1_1.data[x] = name.data[x]; place = name.len; type = name.type; if (type > 7) type = 9; len = name.typelen; if (len > 7) len = 9; df1_1.data[place++] = (type * 16) + len; if (type == 9) df1_1.data[place++] = name.type; if (len == 9) df1_1.data[place++] = name.typelen; if (count == 0) count = 1; location=0; for (x=0;x<count;x++) { if (name.floatdata == TRUE) { d=data.data[location+1]; df1_1.data[place++] = (d & 255); df1_1.data[place++] = (d / 256); d=data.data[location]; df1_1.data[place++] = (d & 255); df1_1.data[place++] = (d / 256); location = location + 2; } if (name.floatdata == FALSE) { d=data.data[x]; df1_1.data[place++] = (d & 255); if (name.typelen > 1) df1_1.data[place++] = (d / 256); } } df1_1.trans = count; memcpy (&header.df1_stuff, &df1_1, PCCC_WORD_LEN + place); header.pccc_length = htons(PCCC_WORD_LEN + place); hlen = _ENET_HEADER_LEN + PCCC_WORD_LEN + place; rcvd = senddf1 (comm1, header, hlen, debug); if (rcvd.df1_stuff[4] != (df1_1.cmd + 0x40)) { retdata.len=255; retdata.data[0]=BADCMDRET; retdata.data[1]=0; return retdata; } if (rcvd.df1_stuff[5] != 0) { retdata.len=255; retdata.data[0]=rcvd.df1_stuff[5]; //Error Response - STS retdata.data[1]=rcvd.df1_stuff[8]; //Error Response - EXT STS return retdata; } return retdata; }
extern struct _typed_data typed_read (struct _comm comm1, char *addr, int count, int plctype, int debug) { struct ethernet_header header,rcvd; struct pccc_word_read df1_1; struct namedata name; struct _typed_data data; struct custom_pccc custom; int place,start,hlen; bzero (&header,sizeof(header)); bzero (&rcvd, sizeof(rcvd)); bzero (&data, sizeof(data)); header.mode = 1; header.submode = 7; header.conn = htonl(comm1.commid); custom.request_id = 0xe87573; custom.name_id = 0; memcpy (&header.custom, &custom, _CUSTOM_LEN); df1_1.src=0; df1_1.control=5; df1_1.dst=0; df1_1.lsap=0; df1_1.cmd=0x0f; df1_1.sts=0; df1_1.tns=htons(comm1.tns); df1_1.fnc=0x68; df1_1.offset = 0; name = nameconv5(addr,plctype,debug); memcpy (&data.name,&name,sizeof(name));; for (x=0;x<name.len;x++) df1_1.data[x] = name.data[x]; place = name.len; if (count == 0) count = 1; df1_1.trans= (count); df1_1.data[place++] = ((byte)count & 255); df1_1.data[place++] = ((byte) count / 256); memcpy (&header.df1_stuff, &df1_1, PCCC_WORD_LEN+place); hlen = _ENET_HEADER_LEN + PCCC_WORD_LEN + place; header.pccc_length = htons(PCCC_WORD_LEN + place); rcvd = senddf1 (comm1, header, hlen, debug); if (rcvd.df1_stuff[4] != (df1_1.cmd + 0x40)) { data.typelen=-1; data.data[0]=BADCMDRET; data.data[1]=0; return data; } if (rcvd.df1_stuff[5] != 0) { data.typelen=-1; data.data[0]=rcvd.df1_stuff[5]; //Error Response - STS data.data[1]=rcvd.df1_stuff[8]; //Error Response - EXT STS return data; } start=9; data.type = (rcvd.df1_stuff[8] / 16); data.typelen = (rcvd.df1_stuff[8] & 15); if (data.type > 7) { data.type = rcvd.df1_stuff[start++]; } if (data.typelen > 7) { data.typelen = rcvd.df1_stuff[start++]; } if (data.type == 9) { data.type = (rcvd.df1_stuff[start] / 16); data.typelen = (rcvd.df1_stuff[start++] & 15); if (data.type == 9) data.type = rcvd.df1_stuff[start++]; if (data.typelen == 9) data.typelen = rcvd.df1_stuff[start++]; } if (name.floatdata == TRUE) count = count * 2; data.len = count; switch (name.section) { case 0: case 2: for (x=0;x<data.len;x++) { switch (data.typelen) { case 1: data.data[x] = rcvd.df1_stuff[start++]; break; case 2: data.data[x] = (rcvd.df1_stuff[start+1]*256) + rcvd.df1_stuff[start]; start = start + data.typelen; break; case 4: data.data[x++] = (rcvd.df1_stuff[start+3]*256) + rcvd.df1_stuff[start+2]; data.data[x] = (rcvd.df1_stuff[start+1]*256) + rcvd.df1_stuff[start+0]; start = start + data.typelen; break; } } break; case 1: case 3: case 4: case 5: case 6: data.len = data.typelen; data.len++; for (x=0;x<data.len;x++) { data.data[x] = rcvd.df1_stuff[x+start]; } } return data; }
extern struct _data protwrite2 (struct _comm comm1, char *addr, int count, struct _data outdata, int plctype, int debug) { struct ethernet_header header,rcvd; struct pccc_data df1_1; struct _data retdata; struct namedata name; struct custom_pccc custom; int x,place,d,location,hlen; bzero (&header,sizeof(header)); bzero (&rcvd, sizeof(rcvd)); bzero (&retdata,sizeof(retdata)); if (plctype != SLC) return retdata; header.mode = 1; header.submode = PCCC_CMD; header.conn = htonl(comm1.commid); custom.request_id = 0xe87573; df1_1.src=0; df1_1.control=5; df1_1.dst=0; df1_1.lsap=0; df1_1.cmd=0x0f; df1_1.sts=0; df1_1.tns = htons(comm1.tns); df1_1.fnc=0xa9; name = nameconv5(addr,plctype,debug); retdata.name = name; place=0; if (count==0) count=1; df1_1.data[place++] = name.typelen * count; if (name.file > 254) { df1_1.data[place++] = 0xff; df1_1.data[place++] = (name.file & 255); df1_1.data[place++] = (name.file / 256); } if (name.file < 255) df1_1.data[place++] = name.file; df1_1.data[place++] = name.type; if (name.element > 254) { df1_1.data[place++] = 0xff; df1_1.data[place++] = (name.element & 255); df1_1.data[place++] = (name.element / 256); } if (name.element < 255) df1_1.data[place++] = name.element; location=0; for (x=0;x<count;x++) { if (name.floatdata == TRUE) { d=outdata.data[location+1]; df1_1.data[place++] = (d & 255); df1_1.data[place++] = (d / 256); d=outdata.data[location]; df1_1.data[place++] = (d & 255); df1_1.data[place++] = (d / 256); location = location + 2; } if (name.floatdata == FALSE) { d=outdata.data[x]; df1_1.data[place++] = (d & 255); if (name.typelen > 1) df1_1.data[place++] = (d / 256); } } memcpy (&header.df1_stuff, &df1_1, PCCC_DATA_LEN+place); header.pccc_length = htons(PCCC_DATA_LEN+place); hlen = _ENET_HEADER_LEN + PCCC_DATA_LEN + place; rcvd = senddf1 (comm1, header, hlen, debug); if (rcvd.df1_stuff[4] != (df1_1.cmd + 0x40)) { retdata.len=-1; retdata.data[0]=BADCMDRET; retdata.data[1]=0; return retdata; } if (rcvd.df1_stuff[5] != 0) { retdata.len=-1; retdata.data[0]=rcvd.df1_stuff[5]; //Error Response - STS retdata.data[1]=rcvd.df1_stuff[8]; //Error Response - EXT STS return retdata; } return retdata; }
extern struct _data protread4 (struct _comm comm1, char *addr, int count, int bitmask, int plctype, int debug) { struct ethernet_header header,rcvd; struct pccc_data df1_1; struct namedata name; struct _data data; struct custom_pccc custom; int place,index,hlen; bzero (&header,sizeof(header)); bzero (&rcvd, sizeof(rcvd)); bzero (&custom, sizeof(custom)); bzero (&data, sizeof(data)); if (plctype != SLC) return data; header.mode = 1; header.submode = PCCC_CMD; header.conn = htonl(comm1.commid); custom.request_id = htonl(0x7377e8); memcpy (&header.custom, &custom, _CUSTOM_LEN); df1_1.src=0; df1_1.control=5; df1_1.dst=0; df1_1.lsap=0; df1_1.cmd=0x0f; df1_1.sts=0; df1_1.tns=htons(comm1.tns); df1_1.fnc=0xa3; name = nameconv5(addr,plctype,debug); data.name = name; place=0; df1_1.data[place++] = name.typelen * count; if (name.file > 254) { df1_1.data[place++] = 0xff; df1_1.data[place++] = (name.file & 255); df1_1.data[place++] = (name.file / 256); } if (name.file < 255) df1_1.data[place++] = name.file; df1_1.data[place++] = name.type; if (name.element > 254) { df1_1.data[place++] = 0xff; df1_1.data[place++] = (name.element & 255); df1_1.data[place++] = (name.element / 256); } if (name.element < 255) df1_1.data[place++] = name.element; df1_1.data[place++] = name.subelement; df1_1.data[place++] = (bitmask & 255); df1_1.data[place++] = (bitmask / 256); memcpy (&header.df1_stuff, &df1_1, PCCC_DATA_LEN + place); header.pccc_length = htons(PCCC_DATA_LEN + place); hlen = _ENET_HEADER_LEN + PCCC_DATA_LEN + place; rcvd = senddf1 (comm1, header, hlen, debug); if (rcvd.df1_stuff[4] != (df1_1.cmd + 0x40)) { data.len=-1; data.data[0]=BADCMDRET; data.data[1]=0; return data; } if (rcvd.df1_stuff[5] != 0) { data.len=-1; data.data[0]=rcvd.df1_stuff[5]; //Error Response - STS data.data[1]=rcvd.df1_stuff[8]; //Error Response - EXT STS return data; } data.len = count; if (name.floatdata == TRUE) count = count * 2; for (x=0;x<count;x++) { index = 8+(x*name.typelen); switch (name.typelen) { case 1: data.data[x] = rcvd.df1_stuff[index]; break; case 2: data.data[x] = (rcvd.df1_stuff[index+1]*256) + rcvd.df1_stuff[index]; break; case 4: data.data[x++] = (rcvd.df1_stuff[index+3]*256) + rcvd.df1_stuff[index+2]; data.data[x] = (rcvd.df1_stuff[index+1]*256) + rcvd.df1_stuff[index]; break; } } return data; }
extern struct _data word_write (struct _comm comm1, char *addr, int count, struct _data outdata, int plctype, int debug) { struct ethernet_header header,rcvd; struct pccc_word_read df1_1; struct _data retdata; struct namedata name; struct custom_pccc custom; int x,place,d,hlen; bzero (&header,sizeof(header)); bzero (&rcvd, sizeof(rcvd)); bzero (&retdata,sizeof(retdata)); header.mode = 1; header.submode = PCCC_CMD; header.conn = htonl(comm1.commid); custom.request_id = 0xe87573; df1_1.src=0; df1_1.control=5; df1_1.dst=0; df1_1.lsap=0; df1_1.cmd=0x0f; df1_1.sts=0; if (plctype == PLC5250) df1_1.tns = comm1.tns; if (plctype != PLC5250) df1_1.tns = htons(comm1.tns); df1_1.fnc=0; df1_1.offset = 0; name = nameconv5(addr,plctype,debug); for (x=0;x<name.len;x++) df1_1.data[x] = name.data[x]; place = name.len; if (count == 0) count = 1; count = count * 2; for (x=0;x<(count/2);x++) { d=outdata.data[x]; df1_1.data[place] = (d & 255); place++; df1_1.data[place] = (d / 256); place++; } if (plctype == PLC5250) df1_1.trans = (count/2); if (plctype != PLC5250) df1_1.trans = htons(count/2); // place++; memcpy (&header.df1_stuff, &df1_1, PCCC_WORD_LEN+place); header.pccc_length = htons(PCCC_WORD_LEN+place); hlen = _ENET_HEADER_LEN + PCCC_WORD_LEN + place; rcvd = senddf1 (comm1, header, hlen, debug); if (rcvd.df1_stuff[4] != (df1_1.cmd + 0x40)) { retdata.len=-1; retdata.data[0]=BADCMDRET; retdata.data[1]=0; return retdata; } if (rcvd.df1_stuff[5] != 0) { retdata.len=-1; retdata.data[0]=rcvd.df1_stuff[5]; //Error Response - STS retdata.data[1]=rcvd.df1_stuff[8]; //Error Response - EXT STS return retdata; } return retdata; }