我的目标是创建一个 DLL,允许我通过 ADS 从 Beckhoff PLC 程序读取数据。为此,我创建了一个 DLL 和一个测试程序。在 DLL 中,我使用 Beckhoff 的 TcAdsDll 和一个专门创建的类,其中包含所有必需的函数和数据类型。 DLL 编译时没有错误消息。当通过调用 DLL 的函数来编译我的测试程序时,我收到错误:
>E0337 linkage specification is incompatible with previous "AdsAmsPortEnabled" (declared at line 143) famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h
Error (active) E0067 expected a '}' famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h
Error C2065 'NULL': undeclared identifier famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsDef.h
Error C2065 'BOOL': undeclared identifier famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h
Error C2065 'pbEnabled': undeclared identifier famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h
Error C2061 syntax error: identifier 'BOOL' famosAdsTestEnvironment C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h
单击所有错误将转到 Beckhoff 的 ADS-Dll 的只读头文件。我已经能够使用搜索功能找出包含头文件时可能发生的错误。然而我找不到它
下面是我写的代码
Dll 头文件
#pragma once
#include "C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsDef.h"
#include "C:\TwinCAT\AdsApi\TcAdsDll\Include\TcAdsAPI.h"
#ifdef FAMOSADSLIBRARY_EXPORTS
#define FAMOSADSLIBRARY_API __declspec(dllexport)
#else
#define FAMOSADSLIBRARY_API __declspec(dllimport)
#endif
class FAMOSADSLIBRARY_API adsCommunication {
private:
long nErr, nPort = 0;
AmsAddr Addr;
PAmsAddr pAddr = &Addr;
int adress;
int datatyp;
public:
adsCommunication(int datatyp = 0x4, int adress = 0x0) {
this->datatyp = datatyp;
this->adress = adress;
}
void connectADS();
void disconnectADS();
float readADS();
void writeADS(int data);
};
DLL 主
#include "pch.h"
#include "famosAdsLibrary.h"
#include <iostream>
#include "framework.h"
#include <conio.h>
#include <windows.h>
using namespace std;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
void adsCommunication::connectADS() {
// Open communication port on the ADS router
nPort = AdsPortOpen();
nErr = AdsGetLocalAddress(pAddr);
if (nErr) cerr << "Error: AdsGetLocalAddress: " << nErr << '\n';
pAddr->port = 851;
}
float adsCommunication::readADS() {
INT data = 0;
nErr = AdsSyncReadReq(pAddr, 0x4020, adress, datatyp, &data);
if (nErr) cerr << "Error: AdsSyncReadReq: " << nErr << '\n';
cout << data << endl;
return data;
}
void adsCommunication::writeADS(int data) {
nErr = AdsSyncWriteReq(pAddr, 0x4020, adress, datatyp, &data);
if (nErr) cerr << "Error: AdsSyncWriteReq: " << nErr << '\n';
}
void adsCommunication::disconnectADS() {
nErr = AdsPortClose();
if (nErr) cerr << "Error: AdsPortClose: " << nErr << '\n';
}
测试程序头文件
#pragma once
#include <famosAdsLibrary.h>
#include <Windows.h>
测试程序主
#include "Main.h"
int main() {
int value = 0;
adsCommunication data(0x4, 0x0);
data.connectADS();
while (1)
{
value = data.readADS();
if (value >= 800) {
value = 0;
data.writeADS(wert);
}
}
data.disconnectADS();
system("PAUSE");
return 0;
}
以下是倍福头文件只读代码中的错误
#ifndef __ADSAPI_H__
#define __ADSAPI_H__
#define ADSAPIERR_NOERROR 0x0000
#ifdef __cplusplus
extern "C"
{
#endif
//other dllexports without error
__declspec( dllexport )
long __stdcall AdsAmsPortEnabled(BOOL *pbEnabled);
// more dllexports without error
__declspec( dllexport )
long __stdcall AdsAmsPortEnabledEx(long nPort, BOOL *pbEnabled);
感谢您的帮助
在 Testprogram.h 中交换 #include