私はctypesを使用してPython経由でいくつかのC dll(FANUC FOCASライブラリ - CNC用)コードを移植しようとしているので、移植コードを書きました。 (以下のように)、DLLをロードして関数を呼び出すと非常に奇妙な結果が得られます。私の場合、私はPythonでハンドラを使用することを理解していません。ハンドラの問題Pythonでcdllを適用する
私はPythonで次のCコードを適用したいと思います。
(C用)宣言
#include "fwlib64.h"
FWLIBAPI short WINAPI cnc_allclibhndl3(const char *ipaddr,unsigned short port,
long timeout, unsigned short *FlibHndl);
コード例(C用FOCASライブラリマニュアルで)
#include "fwlib64.h"
void example(void)
{
unsigned short h;
short ret;
ODBST buf;
ret = cnc_allclibhndl3("192.168.0.100", 8193, 1, &h) ;
//
if (!ret) {
cnc_statinfo(h, &buf) ;
cnc_freelibhndl(h) ;
} else {
printf("ERROR!(%d)\n", ret) ;
}
}
Testfocas.py
from ctypes import *
mylib = cdll.LoadLibrary('./Fwlib64.dll')
class ODBSYS(Structure):
pass
_fields_ =[
("dummy", c_ushort),
("max_axis", c_char*2),
("cnc_type", c_char*2),
("mt_type",c_char*2),
("series",c_char*4),
("version",c_char*4),
("axes",c_char*2),]
h=c_ushort()
pt=pointer(h)
ret=c_short()
buf=ODBSYS()
ret=mylib.cnc_allclibhndl3('192.168.0.100',8193,1,pt)
mylib.cnc_statinfo(h,buf)
mylib.cnc_freelibhndl(h)
は、私は、関数が0または-16を返すようにしたいけど、私の場合、関数の戻り値は、私は私が何であったか知らない
EW_OK(0) Normal termination
EW_SOCKET(-16) Socket communication error Check the power supply of CNC, Ethernet I/F board, Ethernet connection cable.
EW_HANDLE(-8) Allocation of handle number is failed.
データウィンドウ関数の
cnc_allclibhndl3 = 65520 (i guess open port)
cnc_statinfo = -8
cnc_freelibhndl -8
戻りステータスがあります間違っている。
ありがとうございました。 上記のソースコードを修正した後、次のエラーが発生します。 ret = mylib.cnc_allclibhndl3( '192.168.0.100'、8193,1、byref(h)) ctypes.ArgumentError:引数1::タイプが間違っています –
Dogdripnet
あなたはPython 3の可能性が高いです。合格最初のパラメータとしてのバイト文字列。 'b'192.168.0.100''。 Unicode文字列は 'c_wchar_t'に対応します。 –
あなたは正しいです。私の開発環境はPython3です。ご協力ありがとうございました! – Dogdripnet