Example #1
0
int readplc(PLC *plc,Eip_Session *session,Eip_Connection *connection,char *address,Data_Type type,double *value)
{	DHP_Header temp={0,0,0,0};
	DHP_Header *dhp=&temp;
	//PCCC_Header *head=NULL;
	int tns=getpid();

	switch (plc->PlcType)
	{
		case PLC5:
		case SLC500:
			{
				PLC_Read *data=NULL;
				dhp->Dest_adress=plc->Node;
				if (plc->NetWork) // DHP
					data=ReadPLCData(session,connection,dhp,NULL,0,plc->PlcType,tns++,address,1);
				else data=ReadPLCData(session,connection,NULL,NULL,0,plc->PlcType,tns++,address,1);
				if (data!=NULL)
				{
					if (!cip_errno)
					{
						*value=PCCC_GetValueAsFloat(data,0);
						Log(LOG_DEBUG,"ReadPlc : %s on %s = %f (%s)\n",address,plc->PlcName,*value,cip_err_msg);
					}	else
					{
						Log(LOG_WARNING,"Get PCCC value on tag %s (%s) : (%d / ext %d) %s\n",address,plc->PlcName,cip_errno,cip_err_msg,cip_ext_errno);
					}
					free(data);
				} else
				{
					Log(LOG_WARNING,"Error while decoding PCCC value on tag %s (%s) : (%d) %s\n",address,plc->PlcName,cip_errno,cip_err_msg);
				}
			}; break;
		case LGX:
		{
			LGX_Read *data=ReadLgxData(session,connection,address,1);
			if (data!=NULL)
			{
				if (!cip_errno)
				{
					*value=GetLGXValueAsFloat(data,0);
					Log(LOG_DEBUG,"ReadPlc : %s on %s = %f (%s)\n",address,plc->PlcName,*value,cip_err_msg);
				}	else
				{
					Log(LOG_WARNING,"Get value : (%d) %s\n",cip_errno,cip_err_msg);
				}
				free(data);
			} else
			{
				Log(LOG_WARNING,"ReadLgxData error on tag : %s (%d : %s)\n",address,cip_errno,cip_err_msg);
			}
		}; break;
		default:Log(LOG_WARNING,"Plc type unknow for : %s\n",plc->PlcName);
			break;
	}
	return(cip_errno);
}
Example #2
0
int ReadTag(TAG *tag)
{
	int result=0;
	DHP_Header dhp={0,0,0,0};
	if (tag->Plc->Session==NULL)
	{
		if (!BuildSession(tag->Plc)) return(0);
	}
	if (tag->Plc->Connection==NULL)
	{
		if (!BuildConnection(tag->Plc)) return(0);
	}
	Log(LOG_DEBUG,"ReadTag : %s (%p / %p)\n",tag->TagName,tag->Plc->Session,tag->Plc->Connection);
	switch (tag->Plc->PlcType)
	{
		case PLC5:
		case SLC500:
			{ PLC_Read *data;
				dhp.Dest_adress=tag->Plc->Node;
				if (tag->Plc->NetWork) // DHP
					data=ReadPLCData(tag->Plc->Session,tag->Plc->Connection,&dhp,NULL,0,tag->Plc->PlcType,tns++,tag->TagName,1);
				else data=ReadPLCData(tag->Plc->Session,tag->Plc->Connection,NULL,NULL,0,tag->Plc->PlcType,tns++,tag->TagName,1);
				//Log(LOG_DEBUG,"Reading : %s on %s (%s)\n",TAGs[i].TagName,(TAGs[i].Plc)->PlcName,s_err_msg);
				if (data!=NULL)
				{
					tag->Value=PCCC_GetValueAsFloat(data,0);
					if (!cip_errno) 
					{
						Log(LOG_DEBUG,"%s on %s = %f (%s)\n",tag->TagName,tag->Plc->PlcName,tag->Value,cip_err_msg);
						result=1;
					}	else 
					{
						Log(LOG_WARNING,"Get PCCC value on tag %s: (%d / ext %d) %s\n",tag->TagName,cip_errno,cip_err_msg,cip_ext_errno);
						result=0;
					}
					free(data);
				} else
				{
					Log(LOG_WARNING,"ReadPLCData error on tag %s: (%d) %s\n",tag->TagName,cip_errno,cip_err_msg);
					result=0;
				}
			}; break;
		case LGX:
		{
			LGX_Read *data=ReadLgxData(tag->Plc->Session,tag->Plc->Connection,tag->TagName,1);
			if (data!=NULL)
			{
				tag->Value=GetLGXValueAsFloat(data,0);
				if (!cip_errno) 
				{
					Log(LOG_DEBUG,"%s on %s = %f (%s)\n",tag->TagName,tag->Plc->PlcName,tag->Value,cip_err_msg);
					result=1;
				}	else 
				{
					Log(LOG_WARNING,"Get value : (%d) %s\n",cip_errno,cip_err_msg);
					result=0;
				}
				free(data);
			} else 
			{
				Log(LOG_WARNING,"ReadLgxData error on tag : %s (%s)\n",tag->TagName,cip_err_msg);
				result=0;
			}
		}; break;
		default:Log(LOG_WARNING,"Plc type unknow for : %s\n",tag->Plc->PlcName);
			break;
	}
	if (result) tag->Time_Value=time(NULL);
	return(result);
}
Example #3
0
int ReadTag(PLC *Plc, Eip_Session *Session, Eip_Connection *Connection, char *TagName, int *DataType, char *responseValue)
{
	int result=SUCCESS;
	DHP_Header dhp={0,0,0,0};
	int tns=getpid();
	float FValue;
	int IValue;
	
	Log(LOG_DEBUG,"[ReadTag] %s [%s](%p / %p)\n",TagName,writeValue,Session,Connection);
	switch (Plc->PlcType)
	{
		case PLC5:
		case SLC500:
		{ 
			PLC_Read *data;
			dhp.Dest_adress=Plc->Node;
			if (Plc->NetWork) // DHP
				data=ReadPLCData(Session,Connection,&dhp,NULL,0,Plc->PlcType,tns++,TagName,1);
			else data=ReadPLCData(Session,Connection,NULL,NULL,0,Plc->PlcType,tns++,TagName,1);
			if (data!=NULL)
			{
				Log(LOG_DEBUG,"[ReadTag] %s on %s Datatype:%x (%s)\n",TagName,Plc->PlcName,data->type,cip_err_msg);
				*DataType = data->type;
				switch (data->type)
				{
					case PLC_BIT:
					case PLC_INTEGER:
					// TODO case PLC_TIMER:
					{
						IValue=PCCC_GetValueAsBoolean(data,0);
						if (!cip_errno) 
						{
							Log(LOG_DEBUG,"[ReadTag] %s on %s = %d (%s)\n",TagName,Plc->PlcName,IValue,cip_err_msg);
							sprintf(responseValue,"%d",IValue);
							result=SUCCESS;
						}	else 
						{
							Log(LOG_WARNING,"[ReadTag] Get PCCC value on tag %s: (%d / ext %d) %s\n",TagName,cip_errno,cip_err_msg,cip_ext_errno);
							result=ERROR;
						}	
					}break;
					case PLC_FLOATING:
					{
						FValue=PCCC_GetValueAsFloat(data,0);
						if (!cip_errno) 
						{
							Log(LOG_DEBUG,"[ReadTag] %s on %s = %f (%s)\n",TagName,Plc->PlcName,FValue,cip_err_msg);
							sprintf(responseValue,"%f",FValue);
							result=SUCCESS;
						}	else 
						{
							Log(LOG_WARNING,"[ReadTag] Get PCCC value on tag %s: (%d / ext %d) %s\n",TagName,cip_errno,cip_err_msg,cip_ext_errno);
							result=ERROR;
						}
					}break;
					default:{
						Log(LOG_WARNING,"[ReadTag] Datatype type unknown for : %s\n",TagName);
						result=ERROR;
					}
					break;
				}
				free(data);
			} else
			{
				Log(LOG_WARNING,"[ReadTag] ReadPLCData error on tag %s: (%d) %s\n",TagName,cip_errno,cip_err_msg);
				result=ERROR;
			}
		}; break;
		case LGX:
		{
			LGX_Read *data=ReadLgxData(Session,Connection,TagName,1);
			if (data!=NULL)
			{
				Log(LOG_DEBUG,"[ReadTag] %s on %s Datatype:%x (%s)\n",TagName,Plc->PlcName,data->type,cip_err_msg);
				*DataType = data->type;
				switch(data->type)
				{
					case LGX_BOOL:
						{
							IValue=GetLGXValueAsInteger(data,0);
							if (!cip_errno) 
							{
								if (IValue!=0) IValue=1;
								Log(LOG_DEBUG,"[ReadTag] %s on %s = %d (%s)\n",TagName,Plc->PlcName,IValue,cip_err_msg);
								sprintf(responseValue,"%d",IValue);
								result=SUCCESS;
							}	else 
							{
								Log(LOG_WARNING,"[ReadTag] Get value : (%d) %s\n",cip_errno,cip_err_msg);
								result=ERROR;
							}
						}break;
					case LGX_BITARRAY:
						{
							//
						}break;
					case LGX_SINT:
					case LGX_INT:
					case LGX_DINT:
						{
							IValue=GetLGXValueAsInteger(data,0);
							if (!cip_errno) 
							{
								Log(LOG_DEBUG,"[ReadTag] %s on %s = %d (%s)\n",TagName,Plc->PlcName,IValue,cip_err_msg);
								sprintf(responseValue,"%d",IValue);
								result=SUCCESS;
							}	else 
							{
								Log(LOG_WARNING,"[ReadTag] Get value : (%d) %s\n",cip_errno,cip_err_msg);
								result=ERROR;
							}
						}break;
					case LGX_REAL:
						{
							FValue=GetLGXValueAsFloat(data,0);
							if (!cip_errno) 
							{
								Log(LOG_DEBUG,"[ReadTag] %s on %s = %f (%s)\n",TagName,Plc->PlcName,FValue,cip_err_msg);
								sprintf(responseValue,"%f",FValue);
								result=SUCCESS;
							}	else 
							{
								Log(LOG_WARNING,"[ReadTag] Get value : (%d) %s\n",cip_errno,cip_err_msg);
								result=ERROR;
							}
						}break;
				}
				free(data);
			} else 
			{
				Log(LOG_WARNING,"[ReadTag] ReadLgxData error on tag : %s (%s)\n",TagName,cip_err_msg);
				result=ERROR;
			}
		}; break;
		default:{
			Log(LOG_WARNING,"[ReadTag] Plc type unknown for : %s\n",Plc->PlcName);
				result=ERROR;
			}
			break;
	}
	return result;
}