我正在尝试编写一个与scada软件程序接口的python程序。 scada程序通过一些dll文件提供api,并在帮助中提供了一些示例代码(用C语言编写)。所以基本上我试图将示例代码翻译成python。这是我正在使用的代码:
HANDLE hSearch;
HANDLE hObject;
HANDLE hFind;
// Search the Tag table
hSearch = ctFindFirst(hCTAPI, "Tag", NULL, &hObject, 0);
if (hSearch == NULL) {
// no tags found
} else {
do {
char sName[32];
// Get the tag name
ctGetProperty(hObject, "Tag", sName, sizeof(sName), NULL,
DBTYPE_STR);
} while (ctFindNext(hSearch, &hObject));
ctFindClose(hSearch);
}
// Get Historical Trend data via CTAPI
// Get 100 samples of the CPU trend at 2 second
hFind = ctFindFirst(hCTAPI, "CTAPITrend(\"10:15:00 \", \"11/8/1998\", 2, 100, 0, \"CPU\")", &hObject, 0);
while (hFind) {
char sTime[32], sDate[32], sValue[32];
ctGetProperty(hObject, "TIME", sTime, sizeof(sTime), NULL, DBTYPE_STR);
ctGetProperty(hObject, "DATE", sDate, sizeof(sDate), NULL, DBTYPE_STR);
ctGetProperty(hObject, "CPU", sValue, sizeof(sValue), NULL, DBTYPE_STR);
// do something with the trend data.
if (!ctFindNext(hFind, &hObject)) {
ctFindClose(hFind);
hFind = NULL;
break;
}
}
我有两个问题。第一个是我不知道如何使用ctypes在DBTYPE_STR
函数中使用ctGetProperty
数据类型。 API帮助提供有关该参数(dwType)的信息:
dwType
Type: DWORD
Input/output: Input
Description: The desired return type as follows:
Value | Meaning
DBTYPE_UI1 | UCHAR
DBTYPE _I1 | 1 byte INT
DBTYPE _I2 | 2 byte INT
DBTYPE _I4 | 4 byte INT
DBTYPE _R4 | 4 byte REAL
DBTYPE _R8 | 8 byte REAL
DBTYPE _BOOL | BOOLEAN
DBTYPE_BYTES | Byte stream
DBTYPE _STR | NULL Terminated STRING
我无法弄清楚的另一件事是如何使用ctypes声明一个句柄数据类型。 非常感谢你们提供的任何帮助,谢谢。
答案 0 :(得分:0)
查看模块“ctypes.wintypes”。它定义了很多Windows类型。它为您定义了“HANDLE”和“DWORD”。
dwType是一个DWORD,因此期望一个无符号的32位整数。看起来它是一个恒定的值。如果你能找到用于C / C ++的包含文件,你可以找到DBTYPE_STR计算的整数,并在Python中定义相同的值。