Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}
Exemplo n.º 7
0
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;
}