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); }
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); }
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; }