我的程序出现问题,我正在使用Embarcadero XE8 C ++构建器进行32位工作。
当我想使用一种方法将内容读/写到PLC(可编程逻辑控制器,通常用于与机器通信)时,我得到的对象是NULL
。
我只是有一个Main表单,我想在其中创建与PLC的连接。
在我的主要我有:
static CEasyPLCHandler *pPLCHandler;
在同一页面上的方法中,我有:
long ReadWriteTest(void)
{
unsigned long ulStart;
PlcSymbolDesc *pSymbols;
unsigned long ulNumOfSymbols = 0;
int iNumOfVars = 2;
int i;
char **ppszVars = new char*[iNumOfVars];
for (i=0; i< iNumOfVars; i++)
ppszVars[i] = new char[255];
long lResult = RESULT_FAILED;
lResult = pPLCHandler->GetAllItems(&pSymbols, &ulNumOfSymbols);
if (lResult == RESULT_OK)
当我调试时,它显示pPLCHandler = NULL
当我检查出哪里CEasyPLCHandle
来的时候,我来到一个页面(我从库中包含了该页面),并看到以下几行:
class PLCH_DLL_DECL CEasyPLCHandler : public CPLCHandler
{
public:
CEasyPLCHandler(RTS_HANDLE hLogFile = RTS_INVALID_HANDLE);
CEasyPLCHandler(PlcConfig *pPlcConfig, PlcDeviceDesc *pDeviceDesc, RTS_HANDLE hLogFile = RTS_INVALID_HANDLE);
CEasyPLCHandler(unsigned long ulId, char *pszIniFile, RTS_HANDLE hLogFile = RTS_INVALID_HANDLE);
CEasyPLCHandler(char *pszPlcName, char *pszIniFile, RTS_HANDLE hLogFile = RTS_INVALID_HANDLE);
virtual ~CEasyPLCHandler(void);
// See PLCConfig.h for defines of pszProtocol
// e.g. #define PLCC_DN_TCPIP_L2ROUTE "Tcp/Ip (Level 2 Route)"
virtual long ConnectTcpipViaGateway(char *pszGatewayIP, char *pszPlcIP, char *pszProtocol = PLCC_DN_TCPIP_L2ROUTE, int bMotorola = 0, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT, unsigned long ulPort = 1200);
virtual long ConnectRs232ViaGateway(char *pszGatewayIP, short sPort, unsigned long ulBaudrate, int bMotorola = 0, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
virtual long ConnectRs232ViaGatewayEx(char *pszGatewayIP, short sPort, unsigned long ulBaudrate, int bMotorola = 0, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT, EXT_RS232_PARAMStyp *pExtParams = NULL);
virtual long ConnectTcpipViaArti(char *pszPlcIP, char *pszProtocol = PLCC_DN_TCPIP_L2ROUTE, int bMotorola = 0, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT, unsigned long ulPort = 1200);
virtual long ConnectRs232ViaArti(short sPort, unsigned long ulBaudrate, int bMotorola = 0, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
virtual long ConnectToSimulation(char *pszSdbFile, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
virtual long ConnectViaGateway3(char *pszGatewayIP, char *pszAddress, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
virtual long ConnectViaGateway3Ex(char *pszGatewayIP, unsigned long ulPort, char *pszAddress, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
virtual long ConnectViaArti3(char *pszAddress, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
virtual long ConnectToSimulation3(char *pszSdb3XmlFile, int bLoadSymbols = 1, unsigned long ulTimeout = PLCHANDLER_USE_DEFAULT);
// Attention: The structure of the service must be known in detail!
// An erroneous service might cause a crash of the PLC!
// Send own service to plc and receive reply
virtual long SyncSendService(/*[In]*/ unsigned char *pbySend, /*[In]*/ unsigned long ulSendSize, /*[Out]*/ unsigned char **ppbyRecv, /*[Out]*/ unsigned long *pulRecvSize);
// Send own service to plc
virtual long AsyncSendService(/*[Out]*/ int *piInvokeId, /*[In]*/ unsigned char *pbySend, /*[In]*/ unsigned long ulSendSize, /*[In]*/ CPLCHandlerCallback *pAsyncServiceCallback = NULL);
// Get service reply
virtual long AsyncGetServiceReply(/*[In]*/ int *piInvokeId, /*[Out]*/ unsigned char **ppbyRecv, /*[Out]*/ unsigned long *pulRecvSize, long *plServiceResult);
// Get SessionId for Device services (only used for GW3 and ARTI3)
virtual unsigned long GetDeviceSessionId(void);
};
那么如何创建该对象?
我添加了一行:
pPLCHandler = new CEasyPLCHandler(RTS_INVALID_HANDLE);
并得到一些未解决的外部错误:
[ilink32错误]错误:从C:\ USERS \ BART \ DOCUMENTS \ EMBARCADERO \ STUDIO \ PROJECTS \ REALTEST \ WIN32 \ DEBUG \ UNIT1.OBJ引用的未解决的外部'CEasyPLCHandler ::〜CEasyPLCHandler()'
但是这些已经在另一个文件中了吗?他为什么不能使用这些?
作为...我不能拼写名字的希腊人,已经正确地说了,您不是在初始化指针。静态或全局简单变量(int,double,char及其指针)将始终被初始化为0,这NULL
就是从那里来的。
为了正确地初始化静态对象,您要么需要使用指针,new
要么使用诸如之类的东西static CEasyPLCHandler PLCHandler(RTS_INVALID_HANDLE);
,它将构造该对象并为您保存新对象和后续对象delete
(避免内存泄漏)。
但是,从外观上看,您缺少包含您的代码的实际共享库CEasyPLCHandler object
(至少链接器告诉我的是这样)。
请记住,如果您决定使用自动静态对象,则需要使用.
而不是进行访问->
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句