int _WriteLgxData(Eip_Session *session,Eip_Connection *connection, char *adress,LGX_Data_Type datatype,void *data, /*int datasize,*/CIP_UINT number) { int requestsize; CommonDataService_Reply *rep=NULL; int datasize=number*_GetLGXDataSize(datatype); WriteDataService_Request *request=_BuildLgxWriteDataRequest(adress,datatype,data,datasize,number,&requestsize); Eip_CDI *DataItem=_ConnectedSend(session,connection,request,requestsize); free(request); if (DataItem==NULL) return(Error); rep=_GetService_Reply((Eip_Item*)DataItem,0); if (rep==NULL) return(Error); if (rep->Status!=0) { CIPERROR(AB_Error,rep->Status,_GetExtendedStatus(rep)); free(DataItem); return(Error); } else { int result=_GetService_ReplyNumber((Eip_Item*)DataItem); free(DataItem); return(result); } //return(DataItem->Length); }
LGX_Read *_DecodeLGX(CommonDataService_Reply *reply, int replysize) { void *data = NULL; LGX_Read *result = (LGX_Read *)malloc(sizeof(LGX_Read)); if (result==NULL) { CIPERROR(Sys_Error, errno, 0); return NULL; } memset(result, 0, sizeof(LGX_Read)); result->type = _GetLGXDataType(reply); result->elementsize = _GetLGXDataSize(result->type); data = _GetData(reply); if (result->elementsize <= 0 || data==NULL) { CIPERROR(Internal_Error, E_LGX, __LINE__); free(result); return NULL; } result->totalsize = replysize - (int)((char *)data - (char *)reply); result->Varcount = result->totalsize / result->elementsize; if (result->Varcount < 1) { CIPERROR(Internal_Error, E_LGX, __LINE__); free(result); return NULL; } result = (LGX_Read *)realloc(result, sizeof(LGX_Read) + result->totalsize); if (result == NULL) { CIPERROR(Sys_Error, errno, 0); return NULL; } memcpy((char*)result + sizeof(LGX_Read), data, result->totalsize); return result; }