first
This commit is contained in:
commit
b9fb32c6bc
522
UA_PLC.h
Normal file
522
UA_PLC.h
Normal file
@ -0,0 +1,522 @@
|
||||
#include "open62541.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
typedef unsigned char u8;
|
||||
typedef unsigned short u16;
|
||||
typedef unsigned int u32;
|
||||
typedef long long TIME;
|
||||
typedef long long DT;
|
||||
//typedef int bool;
|
||||
#define bool _Bool
|
||||
#define true 1
|
||||
#define false 0
|
||||
#define MAX_ELEMENTS_INDEXRANGE 10
|
||||
#define MAX_ELEMENTS_BROWSERESULT 10
|
||||
#define MAX_ELEMENTS_NODELIST 10
|
||||
#define MAX_ELEMENTS_ARRAYDIMENSION 10
|
||||
#define MAX_ELEMENTS_NAMESPACES 10
|
||||
#define MAX_ELEMENTS_RELATIVEPATH 10
|
||||
#define MAX_ELEMENTS_MONITORLIST 10
|
||||
#define MAX_ELEMENTS_SELECTIONS 10
|
||||
#define MAX_ELEMENTS_EVENTITEMLIST 10
|
||||
#define MAX_ELEMENTS_METHOD 10
|
||||
|
||||
typedef struct {
|
||||
int type;
|
||||
void *data;
|
||||
} UA_Value;
|
||||
|
||||
typedef struct {
|
||||
int ArgumentSize;
|
||||
UA_Value *value;
|
||||
} UA_Arguments;
|
||||
/*PLCopen strand UA date type*/
|
||||
|
||||
|
||||
typedef struct {
|
||||
size_t length; /* The length of the string */
|
||||
u8 *data; /* The content (not null-terminated) */
|
||||
} STRING;
|
||||
|
||||
typedef enum {
|
||||
UASMM_BestAvailable = 0,
|
||||
UASMM_None = 1,
|
||||
UASMM_Sign = 2,
|
||||
UASMM_SignEncrypt = 3
|
||||
}UASecurityMsgMode;
|
||||
|
||||
typedef enum {
|
||||
UASP_BestAvailable = 0,
|
||||
UASP_None = 1,
|
||||
UASP_Basic128Rsa15 = 2,
|
||||
UASP_Basic256 = 3,
|
||||
UASP_Basic256Sha256 = 4
|
||||
}UASecurityPolicy;
|
||||
|
||||
typedef enum {
|
||||
UATP_UATcp = 1,
|
||||
UATP_WSHttpBinary = 2,
|
||||
UATP_WSHttpXmlOrBinary = 3,
|
||||
UATP_WSHttpXml = 4
|
||||
}UATransportProfile;
|
||||
|
||||
typedef enum {
|
||||
UAIT_Numeric = 0,
|
||||
UAIT_String = 1,
|
||||
UAIT_GUID = 2,
|
||||
UAIT_Opaque = 3
|
||||
}UAIdentifierType;
|
||||
|
||||
|
||||
typedef enum {
|
||||
UAUITT_Anonymous = 0,
|
||||
UAUITT_Username = 1,
|
||||
UAUITT_x509 = 2,
|
||||
UAUITT_IssuedToken = 3
|
||||
}UAUserIdentityTokenType;
|
||||
|
||||
|
||||
typedef enum {
|
||||
UAMS_Unknown = 0,
|
||||
UAMS_ControllerSync = 1,
|
||||
UAMS_FwSync = 2
|
||||
}UAMonitoringSyncMode;
|
||||
|
||||
typedef enum {
|
||||
UADT_None = 0,
|
||||
UADT_Absolute = 1,
|
||||
UADT_Percent = 2
|
||||
}UADeadbandType;
|
||||
|
||||
typedef enum {
|
||||
UABD_Forward = 0,
|
||||
UABD_Inverse = 1,
|
||||
UABD_Both = 2
|
||||
}UABrowseDirection;
|
||||
|
||||
typedef enum {
|
||||
UACS_Connected = 0,
|
||||
UACS_ConnectionError = 1,
|
||||
UACS_Shutdown = 2
|
||||
}UAConnectionStatus;
|
||||
|
||||
typedef enum {
|
||||
UASS_Running = 0,
|
||||
UASS_Failed = 1,
|
||||
UASS_NoConfiguration = 2,
|
||||
UASS_Suspended =3,
|
||||
UASS_Shutdown =4,
|
||||
UASS_Test =5,
|
||||
UASS_CommunicationFault =6,
|
||||
UASS_Unknown =7
|
||||
}UAServerState;
|
||||
|
||||
typedef enum {
|
||||
ReferenceType = 1,
|
||||
IsForward = 2,
|
||||
NodeClass = 4,
|
||||
BrowseName = 8,
|
||||
DisplayName = 16
|
||||
}UABrowseResultMask;
|
||||
|
||||
typedef enum {
|
||||
UAHAUpdateStatusCode_HistorianRaw = 0,
|
||||
UAHAUpdateStatusCode_HistorianCalculated = 1,
|
||||
UAHAUpdateStatusCode_HistorianInterpolated = 2,
|
||||
UAHAUpdateStatusCode_Reserved = 3,
|
||||
UAHAUpdateStatusCode_HistorianPartial = 4,
|
||||
UAHAUpdateStatusCode_HistorianExtraData = 8,
|
||||
UAHAUpdateStatusCode_HistorianMultiValue = 16
|
||||
}UAHAUpdateStatusCode;
|
||||
|
||||
typedef enum {
|
||||
UANCM_None = 0,
|
||||
UANCM_Object = 1,
|
||||
UANCM_Variable = 2,
|
||||
UANCM_Method = 4,
|
||||
UANCM_ObjectType = 8,
|
||||
UANCM_VariableType = 16,
|
||||
UANCM_ReferenceType = 32,
|
||||
UANCM_DataType = 64,
|
||||
UANCM_View = 128,
|
||||
UANCM_All = 0x7fffffff
|
||||
}UANodeClassMask;
|
||||
|
||||
typedef enum {
|
||||
UAAI_NodeID = 1,
|
||||
UAAI_NodeClass = 2,
|
||||
UAAI_BrowseName = 3,
|
||||
UAAI_DisplayName = 4,
|
||||
UAAI_Description = 5,
|
||||
UAAI_WriteMask = 6,
|
||||
UAAI_UserWriteMask = 7,
|
||||
UAAI_IsAbstract = 8,
|
||||
UAAI_Symmetric = 9,
|
||||
UAAI_InverseName = 10,
|
||||
UAAI_ContainsNoLoops = 11,
|
||||
UAAI_EventNotifier = 12,
|
||||
UAAI_Value = 13,
|
||||
UAAI_DataType = 14,
|
||||
UAAI_ValueRank = 15,
|
||||
UAAI_ArrayDimensions = 16,
|
||||
UAAI_AccessLevel = 17,
|
||||
UAAI_UserAccessLevel = 18,
|
||||
UAAI_MinimumSamplingInterval = 19,
|
||||
UAAI_Historizing = 20,
|
||||
UAAI_Executable = 21,
|
||||
UAAI_UserExeNamespaceIndexcutable = 22
|
||||
}UAAttributeID;
|
||||
|
||||
typedef struct {
|
||||
UAUserIdentityTokenType UserIdentityTokenType;
|
||||
STRING TokenParam1;
|
||||
STRING TokenParam2;
|
||||
} UAUserIdentityToken;
|
||||
|
||||
|
||||
typedef struct {
|
||||
u16 NamespaceIndex;
|
||||
STRING Identifier;
|
||||
UAIdentifierType IdentifierType;
|
||||
} UANodeID;
|
||||
|
||||
typedef struct {
|
||||
u32 ServerIndex;
|
||||
STRING NamespaceURI;
|
||||
UANodeID ID;
|
||||
} UAExpandedNodeID;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *Locale;
|
||||
STRING Text;
|
||||
}UALocalizedText;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 StartIndex;
|
||||
u16 EndIndex;
|
||||
}UAIndexRange;
|
||||
|
||||
|
||||
typedef struct {
|
||||
UANodeID ReferenceTypeID;
|
||||
bool IsForward;
|
||||
UAExpandedNodeID NodeID;
|
||||
STRING BrowseName;
|
||||
UALocalizedText DisplayName;
|
||||
UANodeClassMask NodeClass;
|
||||
UAExpandedNodeID TypeDefinition;
|
||||
} UAReferenceDescription;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UAAttributeID AttributeID;
|
||||
u16 IndexRangeCount;
|
||||
UAIndexRange IndexRange[MAX_ELEMENTS_INDEXRANGE];
|
||||
}UANodeAdditionalInfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 NamespaceIndex;
|
||||
STRING Name;
|
||||
}UAQualifiedName;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 AccessLevel; //
|
||||
u32 ArrayDimension[MAX_ELEMENTS_ARRAYDIMENSION]; //
|
||||
UAQualifiedName BrowseName; //
|
||||
bool ContainsNoLoops; //
|
||||
UANodeID DataType; //
|
||||
UALocalizedText Description; //
|
||||
UALocalizedText DisplayName; //
|
||||
u16 EventNotifier; //
|
||||
bool Executable; //
|
||||
bool Historizing; //
|
||||
STRING InverseName; //
|
||||
bool IsAbstract; //
|
||||
TIME MinimumSamplingInterval; //
|
||||
UANodeClassMask NodeClass; //
|
||||
bool Symmetric; //
|
||||
u16 UserAccessLevel; //
|
||||
bool UserExecutable; //
|
||||
u32 UserWriteMask; //
|
||||
int ValueRank; //
|
||||
u32 WriteMask; //
|
||||
}UANodeInformation;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UANodeID ReferenceTypeId;
|
||||
bool IsInverse;
|
||||
bool IncludeSubtypes;
|
||||
UAQualifiedName TargetName;
|
||||
}UARelativePathElement;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 NoOfElements;
|
||||
UARelativePathElement *Elements;
|
||||
}UARelativePath;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UANodeID StartingNode;
|
||||
UARelativePath RelativePath;
|
||||
}UABrowsePath;
|
||||
|
||||
|
||||
typedef struct{
|
||||
//STRING SessionName;
|
||||
//STRING ApplicationName;
|
||||
UASecurityMsgMode SecurityMsgMode;
|
||||
UASecurityPolicy SecurityPolicy;
|
||||
STRING CertificateStore;
|
||||
STRING ClientCertificateName;
|
||||
STRING ServerUri;
|
||||
bool CheckServerCertificate;
|
||||
//UATransportProfile TransportProfile;
|
||||
//UAUserIdentityToken UserIdentityToken;
|
||||
TIME SessionTimeout;
|
||||
//TIME MonitorConnection;
|
||||
//STRING LocaleIDs[6];
|
||||
}UASessionConnectInfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UA_Value Values;
|
||||
DT TimeStamps;
|
||||
u32 *NodeQualityIDs;
|
||||
u16 NewValuesCount;
|
||||
}UAMonitoredVariables;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
TIME SamplingInterval;
|
||||
u16 QueueSize;
|
||||
bool DiscardOldest;
|
||||
UADeadbandType DeadbandType;
|
||||
float Deadband;
|
||||
}UAMonitoringParameter;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UANodeID StartingNodeID;
|
||||
UABrowseDirection Direction;
|
||||
UANodeID ReferenceTypeID;
|
||||
bool IncludeSubtypes;
|
||||
UANodeClassMask NodeClass;
|
||||
UABrowseResultMask ResultMask;
|
||||
}UABrowseDescription;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UA_Value Values;
|
||||
UAHAUpdateStatusCode StatusCode;
|
||||
TIME ServerTimeStamp;
|
||||
TIME SourceTimeStamp;
|
||||
}UAHADataValue;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 nanoSec;
|
||||
u16 microSec;
|
||||
u16 milliSec;
|
||||
u16 sec;
|
||||
u16 min;
|
||||
u16 hour;
|
||||
u16 day; /* From 1 to 31 */
|
||||
u16 month; /* From 1 to 12 */
|
||||
u16 year;
|
||||
} UADateTimeStruct;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 Severity;
|
||||
STRING Message;
|
||||
STRING SourceName;
|
||||
UANodeID SourceNode;
|
||||
UANodeID EventType;
|
||||
TIME Time;
|
||||
TIME ReceiveTime;
|
||||
}UAEventField;
|
||||
|
||||
/**
|
||||
* UA_Connect
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_Connect(STRING endpointUrl,UASessionConnectInfo SessionConnectInfo,long *ConnectionHdl);
|
||||
/**
|
||||
* UA_Disconnect
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_Disconnect(long ConnectionHdl);
|
||||
|
||||
/**
|
||||
* UA_NamespaceGetIndexList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_NamespaceGetIndexList(long ConnectionHdl,u16 NamespaceUrisCount,STRING *NamespaceUris,u16 *NamespaceIndexes);
|
||||
|
||||
/**
|
||||
* UA_ServerGetUriByIndex
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
|
||||
u32 UA_ServerGetUriByIndex(long ConnectionHdl,u32 ServerIndex,STRING *ServerUri);
|
||||
/**
|
||||
* UA_ServerGetIndexByUriList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_ServerGetIndexByUriList(long ConnectionHdl,u16 ServerUrisCount,STRING ServerUris[],u16 *ServerIndexes);
|
||||
/**
|
||||
* UA_TranslatePathList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_TranslatePathList(long ConnectionHdl,u16 BrowsePathsCount,UABrowsePath BrowsePaths[],UANodeID *TargetNodeIDs);
|
||||
/**
|
||||
* UA_NodeGetHandleList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_NodeGetHandleList(long ConnectionHdl,u16 NodeIDCount,UANodeID *NodeIDs,long *NodeHdls,u32 ErrorIDs[]);
|
||||
/**
|
||||
* UA_NodeReleaseHandleList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_NodeReleaseHandleList(long ConnectionHdl,u16 NodeHdlCount,long *NodeHdls,u32 ErrorIDs[]);
|
||||
/**
|
||||
* UA_NodeGetInformation
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_NodeGetInformation(long ConnectionHdl,UANodeID NodeID,UANodeInformation *NodeInfo,u32 ErrorIDs[]);
|
||||
/**
|
||||
* UA_SubscriptionCreate
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_SubscriptionCreate(long ConnectionHdl,bool PublishingEnable,u16 Priority,long *SubscriptionHdl,TIME *PublishingInterval);
|
||||
/**
|
||||
* UA_SubscriptionDelete
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_SubscriptionDelete(long ConnectionHdl,long SubscriptionHdl);
|
||||
|
||||
/**
|
||||
* UA_SubscriptionModify
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_SubscriptionModify(long ConnectionHdl,long SubscriptionHdl,bool PublishingEnable,u16 Priority,TIME *PublishingInterval);
|
||||
/**
|
||||
* UA_SubscriptionProcessed
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_SubscriptionProcessed(long SubscriptionHdl);
|
||||
/**
|
||||
* UA_MonitoredItemAddList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_MonitoredItemAddList(long ConnectionHdl,long SubscriptionHdl,u16 NodeHdlCount,
|
||||
long *NodeHdls,UAMonitoringSyncMode SyncMode,
|
||||
UANodeAdditionalInfo *NodeAddInfos,u32 *MonitoredItemHdls,u32 ErrorIDs[]);
|
||||
/**
|
||||
* UA_MonitoredItemRemoveList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_MonitoredItemRemoveList(long ConnectionHdl,long SubscriptionHdl,u16 MonitoredItemHdlCount,long *MonitoredItemHdls,u32 ErrorIDs[]);
|
||||
/**
|
||||
* UA_MonitoredItemModifyList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_MonitoredItemModifyList(long ConnectionHdl,long SubscriptionHdl,u16 MonitoredItemHdlCount,
|
||||
long *MonitoredItemHdls,UAMonitoringParameter MonitoringParameter[],
|
||||
u32 ErrorIDs[]);
|
||||
/**
|
||||
* UA_MonitoredItemOperateList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_MonitoredItemOperateList(long ConnectionHdl,long SubscriptionHdl,u16 MonitoredItemHdlCount,long *MonitoredItemHdls,
|
||||
UAMonitoredVariables *Variables,
|
||||
bool *ValuesChanged,u16 *MinLostValueCount,u32 *NodeErrorIDs);
|
||||
/**
|
||||
* UA_ReadList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_ReadList(long ConnectionHdl,u16 NodeHdlCount,long *NodeHdls,UANodeAdditionalInfo *NodeAddInfos,UA_Value *variables,u32 ErrorIDs[]);
|
||||
/**
|
||||
* UA_WriteList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_WriteList(long ConnectionHdl,u16 NodeHdlCount,long *NodeHdls,UANodeAdditionalInfo *NodeAddInfos,UA_Value *variables,u32 ErrorIDs[]);
|
||||
/**
|
||||
* UA_MethodGetHandleList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_MethodGetHandleList(long ConnectionHdl,u16 NodeIDCount,UANodeID *ObjectNodeIDs,UANodeID *MethodNodeIDs,long *MethodHdls,u32 ErrorIDs[]);
|
||||
/**
|
||||
* UA_MethodReleaseHandleList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_MethodReleaseHandleList(long ConnectionHdl,u16 MethodHdlCount,long *MethodHdls,u32 *ErrorIDs);
|
||||
/**
|
||||
* UA_MethodCall
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_MethodCall(long ConnectionHdl,long MethodHdl,UA_Arguments *InputArguments, UA_Arguments *OutputArguments);
|
||||
|
||||
/**
|
||||
* UA_Browse
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_Browse(long ConnectionHdl,UABrowseDescription BrowseDescription,u32 ContinuationPointIn,u16 *BrowseResultCount,UAReferenceDescription *BrowseResult,u32 ContinuationPointOut);
|
||||
|
||||
/**
|
||||
* UA_EventItemAdd
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_EventItemAdd(long ConnectionHdl,long SubscriptionHdl,long NodeHdl,
|
||||
UANodeID EventType,u16 EventFieldSelectionCount,
|
||||
UARelativePath *EventFieldSelections,long *EventItemHdl);
|
||||
|
||||
/**
|
||||
* UA_EventItemOperateList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_EventItemOperateList(long ConnectionHdl,long SubscriptionHdl,u16 EventItemHdlCount,long *EventItemHdls,
|
||||
UAEventField *Fields,bool EventProcessed,
|
||||
u16 *RemainingEventCount,u32 *FieldErrorIDs);
|
||||
|
||||
/**
|
||||
* UA_EventItemRemoveList
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_EventItemRemoveList(long ConnectionHdl,long SubscriptionHdl,u16 EventItemHdlCount,long EventItemHdls,u32 ErrorIDs[]);
|
||||
|
||||
/**
|
||||
* UA_HistoryUpdate
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_HistoryUpdate(long ConnectionHdl,long NodeHdl,bool PerformInsert,bool PerformReplace,u16 DataValueCount,UAHADataValue *DataValues);
|
||||
|
||||
/**
|
||||
* UA_ConnectionGetStatus
|
||||
* ^^^^^^^^^^^
|
||||
*/
|
||||
u32 UA_ConnectionGetStatus(long ConnectionHdl,UAConnectionStatus *ConnectionStatus,UAServerState *ServerState,u8 *ServiceLevel);
|
||||
|
||||
|
||||
|
||||
// unsigned short UA_CreatClient(long *client);
|
||||
// unsigned int UA_ConnectServer(long client, const char *endpointUrl);
|
||||
// unsigned int UA_Client_writeValue(long client, char *NodeName, void *value, int type);
|
||||
// unsigned int UA_Client_readNode(long client, char *NodeName, UA_Value *outValue);
|
||||
// unsigned int UA_printValue(UA_Value *value);
|
||||
// unsigned int UA_Client_HistoryRead(long client, char *NodeName);
|
||||
// void UA_Client_Delete(long client);
|
||||
// void UA_Value_Clear(UA_Value *p);
|
||||
// void UA_Value_init(UA_Value *p);
|
||||
// void Browse(long client);
|
BIN
libopcuaClient.so
Normal file
BIN
libopcuaClient.so
Normal file
Binary file not shown.
36
myClient.c
Normal file
36
myClient.c
Normal file
@ -0,0 +1,36 @@
|
||||
#include <string.h>
|
||||
#include "UA_PLC.h"
|
||||
|
||||
UA_Client *client;
|
||||
|
||||
u32 CA_Connect(long *ConnectionHdl,TIME timeout){
|
||||
UA_Client *c = UA_Client_new();
|
||||
UA_StatusCode flag = UA_ClientConfig_setDefault(UA_Client_getConfig(c));
|
||||
UA_ClientConfig *config=UA_Client_getConfig(c);
|
||||
|
||||
config->securityMode=1;
|
||||
config->timeout = timeout;
|
||||
if (flag == UA_STATUSCODE_GOOD) {
|
||||
flag=UA_Client_connect(c, "opc.tcp://localhost:4840");
|
||||
|
||||
}else
|
||||
{
|
||||
UA_Client_delete(c);
|
||||
//memset(c,0,100);
|
||||
return flag;
|
||||
}
|
||||
client = c;
|
||||
*ConnectionHdl = (long *)c;
|
||||
printf("ConnectionHdl %lld \n",*ConnectionHdl);
|
||||
return flag;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
long *hdl;
|
||||
TIME timeout = 200000;
|
||||
CA_Connect(*hdl,timeout);
|
||||
while(1)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
186
myServer.c
Normal file
186
myServer.c
Normal file
@ -0,0 +1,186 @@
|
||||
#include <open62541.h>
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static volatile UA_Boolean running = true;
|
||||
|
||||
static void stopHandler(int sig) {
|
||||
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Received Ctrl-C");
|
||||
running = false;
|
||||
}
|
||||
|
||||
|
||||
static UA_StatusCode
|
||||
helloMethodCallback(UA_Server *server,
|
||||
const UA_NodeId *sessionId, void *sessionContext,
|
||||
const UA_NodeId *methodId, void *methodContext,
|
||||
const UA_NodeId *objectId, void *objectContext,
|
||||
size_t inputSize, const UA_Variant *input,
|
||||
size_t outputSize, UA_Variant *output)
|
||||
{
|
||||
UA_String *inputStr = (UA_String*)input[0].data;
|
||||
const char *helloPrefix = "Hello ";
|
||||
size_t helloLen = strlen(helloPrefix);
|
||||
|
||||
// 分配内存用于存储输出字符串(前缀 + 输入字符串)
|
||||
size_t resultLen = helloLen + inputStr->length;
|
||||
UA_Byte *result = (UA_Byte*)UA_malloc(resultLen);
|
||||
if (!result) {
|
||||
return UA_STATUSCODE_BADOUTOFMEMORY;
|
||||
}
|
||||
|
||||
// 将 "Hello " 和输入字符串复制到结果中
|
||||
memcpy(result, helloPrefix, helloLen);
|
||||
memcpy(result + helloLen, inputStr->data, inputStr->length);
|
||||
|
||||
// 将输出 variant 设置为结果字符串
|
||||
UA_String resultStr;
|
||||
resultStr.data = result;
|
||||
resultStr.length = resultLen;
|
||||
UA_Variant_setScalarCopy(output, &resultStr, &UA_TYPES[UA_TYPES_STRING]);
|
||||
|
||||
// 清理结果缓冲区
|
||||
UA_String_clear(&resultStr);
|
||||
|
||||
return UA_STATUSCODE_GOOD;
|
||||
}
|
||||
|
||||
static void manuallyDefinePump(UA_Server *server)
|
||||
{
|
||||
// 声明并获取服务器分配的节点 ID
|
||||
UA_NodeId pumpId;
|
||||
|
||||
// 定义对象属性并设置显示名称
|
||||
UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
|
||||
oAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Pump (Manual)");
|
||||
|
||||
// 添加泵对象节点
|
||||
UA_Server_addObjectNode(server,
|
||||
UA_NODEID_NULL,
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
|
||||
UA_QUALIFIEDNAME(1, "Pump (Manual)"),
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
|
||||
oAttr, NULL, &pumpId);
|
||||
|
||||
// 定义变量属性并添加“ManufacturerName”变量节点
|
||||
UA_VariableAttributes mnAttr = UA_VariableAttributes_default;
|
||||
UA_String manufacturerName = UA_STRING("Pump King Ltd.");
|
||||
UA_Variant_setScalar(&mnAttr.value, &manufacturerName, &UA_TYPES[UA_TYPES_STRING]);
|
||||
mnAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ManufacturerName");
|
||||
|
||||
UA_Server_addVariableNode(server,
|
||||
UA_NODEID_NULL,
|
||||
pumpId,
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
|
||||
UA_QUALIFIEDNAME(1, "ManufacturerName"),
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
|
||||
mnAttr, NULL, NULL);
|
||||
|
||||
// 定义变量属性并添加“ModelName”变量节点
|
||||
UA_VariableAttributes modelAttr = UA_VariableAttributes_default;
|
||||
UA_String modelName = UA_STRING("Mega Pump 3000");
|
||||
UA_Variant_setScalar(&modelAttr.value, &modelName, &UA_TYPES[UA_TYPES_STRING]);
|
||||
modelAttr.displayName = UA_LOCALIZEDTEXT("en-US", "ModelName");
|
||||
|
||||
UA_Server_addVariableNode(server,
|
||||
UA_NODEID_NULL,
|
||||
pumpId,
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
|
||||
UA_QUALIFIEDNAME(1, "ModelName"),
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
|
||||
modelAttr, NULL, NULL);
|
||||
|
||||
// 定义变量属性并添加“Status”变量节点
|
||||
UA_VariableAttributes statusAttr = UA_VariableAttributes_default;
|
||||
UA_Boolean status = true;
|
||||
UA_Variant_setScalar(&statusAttr.value, &status, &UA_TYPES[UA_TYPES_BOOLEAN]);
|
||||
statusAttr.displayName = UA_LOCALIZEDTEXT("en-US", "Status");
|
||||
|
||||
UA_Server_addVariableNode(server,
|
||||
UA_NODEID_NULL,
|
||||
pumpId,
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
|
||||
UA_QUALIFIEDNAME(1, "Status"),
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
|
||||
statusAttr, NULL, NULL);
|
||||
|
||||
// 定义变量属性并添加“MotorRPM”变量节点
|
||||
UA_VariableAttributes rpmAttr = UA_VariableAttributes_default;
|
||||
UA_Double rpm = 50.0;
|
||||
UA_Variant_setScalar(&rpmAttr.value, &rpm, &UA_TYPES[UA_TYPES_DOUBLE]);
|
||||
rpmAttr.displayName = UA_LOCALIZEDTEXT("en-US", "MotorRPM");
|
||||
|
||||
UA_Server_addVariableNode(server,
|
||||
UA_NODEID_NULL,
|
||||
pumpId,
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
|
||||
UA_QUALIFIEDNAME(1, "MotorRPM"),
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
|
||||
rpmAttr, NULL, NULL);
|
||||
|
||||
UA_ObjectAttributes ptAttr = UA_ObjectAttributes_default;
|
||||
ptAttr.displayName = UA_LOCALIZEDTEXT("en-US", "PumpType");
|
||||
UA_NodeId pumpTypeId;
|
||||
UA_Server_addObjectNode(server, UA_NODEID_NULL,
|
||||
pumpId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
|
||||
UA_QUALIFIEDNAME(1, "PumpType"),
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
|
||||
ptAttr,
|
||||
NULL, &pumpTypeId);
|
||||
|
||||
|
||||
UA_Argument inputArgument;
|
||||
UA_Argument_init(&inputArgument);
|
||||
inputArgument.description = UA_LOCALIZEDTEXT("zh-CN", "输入字符串");
|
||||
inputArgument.name = UA_STRING("InputString");
|
||||
inputArgument.dataType = UA_TYPES[UA_TYPES_STRING].typeId; // 字符串类型
|
||||
inputArgument.valueRank = UA_VALUERANK_SCALAR; // 标量
|
||||
|
||||
// 定义方法的输出参数
|
||||
UA_Argument outputArgument;
|
||||
UA_Argument_init(&outputArgument);
|
||||
outputArgument.description = UA_LOCALIZEDTEXT("zh-CN", "输出字符串");
|
||||
outputArgument.name = UA_STRING("OutputString");
|
||||
outputArgument.dataType = UA_TYPES[UA_TYPES_STRING].typeId; // 字符串类型
|
||||
outputArgument.valueRank = UA_VALUERANK_SCALAR; // 标量
|
||||
|
||||
// 添加方法节点
|
||||
UA_MethodAttributes helloAttr = UA_MethodAttributes_default;
|
||||
helloAttr.description = UA_LOCALIZEDTEXT("zh-CN", "添加Hello前缀");
|
||||
helloAttr.displayName = UA_LOCALIZEDTEXT("zh-CN", "HelloMethod");
|
||||
helloAttr.executable = true;
|
||||
helloAttr.userExecutable = true;
|
||||
|
||||
UA_NodeId helloMethodNodeId;
|
||||
UA_Server_addMethodNode(server,
|
||||
UA_NODEID_NULL, // NodeId (自动生成)
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), // 父节点为 ObjectsFolder
|
||||
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), // 引用类型
|
||||
UA_QUALIFIEDNAME(1, "HelloMethod"), // 浏览名称
|
||||
helloAttr, // 属性
|
||||
&helloMethodCallback, // 回调函数
|
||||
1, &inputArgument, // 输入参数的数量和描述
|
||||
1, &outputArgument, // 输出参数的数量和描述
|
||||
NULL,NULL);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
int main(void) {
|
||||
signal(SIGINT, stopHandler);
|
||||
signal(SIGTERM, stopHandler);
|
||||
|
||||
UA_Server *server = UA_Server_new();
|
||||
UA_ServerConfig_setDefault(UA_Server_getConfig(server));
|
||||
|
||||
manuallyDefinePump(server);
|
||||
|
||||
UA_StatusCode retval = UA_Server_run(server, &running);
|
||||
UA_Server_delete(server);
|
||||
return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
}
|
BIN
obj/Debug/UA_PLC.o
Normal file
BIN
obj/Debug/UA_PLC.o
Normal file
Binary file not shown.
BIN
obj/Debug/open62541.o
Normal file
BIN
obj/Debug/open62541.o
Normal file
Binary file not shown.
49
opcuaClient.cbp
Normal file
49
opcuaClient.cbp
Normal file
@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<CodeBlocks_project_file>
|
||||
<FileVersion major="1" minor="6" />
|
||||
<Project>
|
||||
<Option title="opcuaClient" />
|
||||
<Option pch_mode="2" />
|
||||
<Option compiler="gcc" />
|
||||
<Build>
|
||||
<Target title="Debug">
|
||||
<Option output="opcuaClient.so" imp_lib="$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).a" def_file="$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).def" prefix_auto="1" extension_auto="0" />
|
||||
<Option object_output="obj/Debug/" />
|
||||
<Option type="3" />
|
||||
<Option compiler="gcc" />
|
||||
<Compiler>
|
||||
<Add option="-std=c99" />
|
||||
<Add option="-fPIC" />
|
||||
<Add option="-g" />
|
||||
</Compiler>
|
||||
<Linker>
|
||||
<Add option="-shared" />
|
||||
</Linker>
|
||||
</Target>
|
||||
<Target title="Release">
|
||||
<Option output="bin/Release/opcuaClient" prefix_auto="1" extension_auto="1" />
|
||||
<Option object_output="obj/Release/" />
|
||||
<Option type="1" />
|
||||
<Option compiler="gcc" />
|
||||
<Compiler>
|
||||
<Add option="-O2" />
|
||||
</Compiler>
|
||||
<Linker>
|
||||
<Add option="-s" />
|
||||
</Linker>
|
||||
</Target>
|
||||
</Build>
|
||||
<Compiler>
|
||||
<Add option="-Wall" />
|
||||
</Compiler>
|
||||
<Unit filename="UA_PLC.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="UA_PLC.h" />
|
||||
<Unit filename="open62541.c">
|
||||
<Option compilerVar="CC" />
|
||||
</Unit>
|
||||
<Unit filename="open62541.h" />
|
||||
<Extensions />
|
||||
</Project>
|
||||
</CodeBlocks_project_file>
|
80
opcuaClient.depend
Normal file
80
opcuaClient.depend
Normal file
@ -0,0 +1,80 @@
|
||||
# depslib dependency file v1.0
|
||||
1725872367 source:/media/sf_E_DRIVE/Project/ePLC-Design/ePLC_X86Linux_Git/OPCUA_client/open62541.c
|
||||
"open62541.h"
|
||||
<stddef.h>
|
||||
<math.h>
|
||||
<valgrind/memcheck.h>
|
||||
<limits.h>
|
||||
<stdio.h>
|
||||
<pthread.h>
|
||||
<syslog.h>
|
||||
<limits.h>
|
||||
<string.h>
|
||||
<string.h>
|
||||
<limits.h>
|
||||
<time.h>
|
||||
<sys/time.h>
|
||||
<mach/clock.h>
|
||||
<mach/mach.h>
|
||||
<time.h>
|
||||
<windows.h>
|
||||
<string.h>
|
||||
|
||||
1725934839 /media/sf_E_DRIVE/Project/ePLC-Design/ePLC_X86Linux_Git/OPCUA_client/open62541.h
|
||||
<stdlib.h>
|
||||
<malloc.h>
|
||||
<stdio.h>
|
||||
<errno.h>
|
||||
<winsock2.h>
|
||||
<windows.h>
|
||||
<ws2tcpip.h>
|
||||
<io.h>
|
||||
<unistd.h>
|
||||
<iphlpapi.h>
|
||||
<errno.h>
|
||||
<arpa/inet.h>
|
||||
<netinet/in.h>
|
||||
<netdb.h>
|
||||
<sys/ioctl.h>
|
||||
<sys/select.h>
|
||||
<sys/types.h>
|
||||
<net/if.h>
|
||||
<unistd.h>
|
||||
<fcntl.h>
|
||||
<unistd.h>
|
||||
<sys/socket.h>
|
||||
<sys/param.h>
|
||||
<sys/socket.h>
|
||||
<netinet/tcp.h>
|
||||
<stdlib.h>
|
||||
<stdio.h>
|
||||
<strings.h>
|
||||
<pthread.h>
|
||||
<stdint.h>
|
||||
<limits.h>
|
||||
<wchar.h>
|
||||
<string.h>
|
||||
<stddef.h>
|
||||
<stdint.h>
|
||||
<stdbool.h>
|
||||
<inttypes.h>
|
||||
<alloca.h>
|
||||
<assert.h>
|
||||
<endian.h>
|
||||
<sys/endian.h>
|
||||
<sys/endian.h>
|
||||
<libkern/OSByteOrder.h>
|
||||
<gulliver.h>
|
||||
<stdarg.h>
|
||||
|
||||
1725938499 source:/media/sf_E_DRIVE/Project/ePLC-Design/ePLC_X86Linux_Git/OPCUA_client/UA_PLC.c
|
||||
"UA_PLC.h"
|
||||
<string.h>
|
||||
|
||||
1725872367 /media/sf_E_DRIVE/Project/ePLC-Design/ePLC_X86Linux_Git/OPCUA_client/UA_PLC.h
|
||||
"open62541.h"
|
||||
<stdio.h>
|
||||
<signal.h>
|
||||
<stdlib.h>
|
||||
<assert.h>
|
||||
|
25
opcuaClient.layout
Normal file
25
opcuaClient.layout
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<CodeBlocks_layout_file>
|
||||
<FileVersion major="1" minor="0" />
|
||||
<ActiveTarget name="Debug" />
|
||||
<File name="open62541.c" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="5745" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="UA_PLC.c" open="1" top="1" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="30069" topLine="818" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="open62541.h" open="1" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="69135" topLine="1979" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="UA_PLC.h" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="793" topLine="29" />
|
||||
</Cursor>
|
||||
</File>
|
||||
</CodeBlocks_layout_file>
|
8
opcuaClient/main.c
Normal file
8
opcuaClient/main.c
Normal file
@ -0,0 +1,8 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("Hello world!\n");
|
||||
return 0;
|
||||
}
|
5
opcuaClient/opcuaClient.layout
Normal file
5
opcuaClient/opcuaClient.layout
Normal file
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<CodeBlocks_layout_file>
|
||||
<FileVersion major="1" minor="0" />
|
||||
<ActiveTarget name="Debug" />
|
||||
</CodeBlocks_layout_file>
|
BIN
opcua_client
Executable file
BIN
opcua_client
Executable file
Binary file not shown.
BIN
opcua_server
Executable file
BIN
opcua_server
Executable file
Binary file not shown.
64471
open62541.c
Normal file
64471
open62541.c
Normal file
File diff suppressed because it is too large
Load Diff
31929
open62541.h
Normal file
31929
open62541.h
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user