首页 > 代码库 > 通过CTAPI和Citect SCADA软件进行数据通讯
通过CTAPI和Citect SCADA软件进行数据通讯
参考文献:http://www.docin.com/p-275216804.html
(基于Citect远程控制的变流量堆料控制系统 王玉增,顾英妮,王维 济南大学,机械工程学院 ,Citect,CTAPI)
Citect组态软件已被施耐德收购。通过软件提供的API,可以通过高级语言编程和组态软件内部数据点通讯。
下面是一个Python的例子,暂未测试:
https://github.com/mitchyg/Random/blob/master/pyctapi/src/pyctapi.py
#! /usr/bin/python## File: pyctapi.py# Author: Mitchell Gayner# Date: 06/08/2009## Desc: # Wrapper for Citect CTAPI dll# Compatible with Citect V6.1 DLLs## You must have the following DLLs:# - CiDebugHelp.dll# - Ct_ipc.dll# - CtApi.dll# - CtEng32.dll# - CtRes32.DLL# - CtUtil32.dll#import platformfrom ctypes import * import sysif platform.system() != "Windows": raise OSErrorclass pyCtApi: def __init__(self, dllPath_ = "C:/citect/bin/"): #Load required DLLs CDLL(dllPath_ + ‘/CiDebugHelp‘) CDLL(dllPath_ + ‘/CtUtil32‘) CDLL(dllPath_ + ‘/Ct_ipc‘) self.__libc = CDLL(dllPath_ + ‘/CtApi‘) self.__cn = None # Create connection object def Open(self, address_, username_, password_, mode_ = 0): "Open connection to running citect process" if self.__cn != None: print "Already connected" return self.__cn = windll.CtApi.ctOpen(address_, username_, password_, 2) def Close(self): "Close connection to running citect process" ct = windll.CtApi.ctClose(self.__cn) self.__cn = None def Connected(self): if self.__ExecCicode("Version(0)") != "": return True return False def TagReadInt(self, tagName_): "Read tag from Citect and covert to int" str = self.__TagRead(tagName_) #try: return int(str) #except: return -1 def TagReadFloat(self, tagName_): "Read tag from Citect and covert to float" str = self.__TagRead(tagName_) #try: return float(str) #except: return -1 def TagReadStr(self, tagName_): "Read tag from Citect and covert to string" str = self.__TagRead(tagName_) return str def TagWrite(self, tagName_, value_): "Write value to Citect tag" ok = self.__TagWrite(tagName_, str(value_)) return ok def ExecuteCicode(self, function_): return self.__ExecCicode(function_) def __TagRead(self, tagName_): "PRIVATE: Read tag from Citect tag" f = create_string_buffer(‘\000‘ * 32) ok = windll.CtApi.ctTagRead(self.__cn, tagName_, byref(f), sizeof(f)) return f.value def __TagWrite(self, tagName_, value_): "PRIVATE: Write value to Citect tag" ok = windll.CtApi.ctTagWrite(self.__cn, tagName_, value_) return ok def __ExecCicode(self, function_, hWin_=0, nMode_=0): f = create_string_buffer(‘\000‘ * 32) ok = windll.CtApi.ctCicode(self.__cn, function_, hWin_, nMode_, byref(f), sizeof(f), None) return f.value# TODO LIST:‘‘‘DONE extern HANDLE CTAPICALL ctOpen(LPCSTR,LPCSTR,LPCSTR,DWORD); /* Open CTAPI interface */‘‘‘# extern BOOL CTAPICALL ctOpenEx(LPCSTR,LPCSTR,LPCSTR,DWORD,HANDLE);# extern HANDLE CTAPICALL ctClientCreate();# extern BOOL CTAPICALL ctClientDestroy(HANDLE);‘‘‘DONE extern BOOL CTAPICALL ctClose(HANDLE); /* Close CTAPI interface */‘‘‘# extern BOOL CTAPICALL ctCloseEx(HANDLE, BOOL);# extern BOOL CTAPICALL ctCancelIO(HANDLE,CTOVERLAPPED*); /* cancel pending I/O */‘‘‘DONE extern DWORD CTAPICALL ctCicode(HANDLE,LPCSTR,DWORD,DWORD,LPSTR,DWORD,CTOVERLAPPED*); /* execute cicode */‘‘‘# extern BOOL CTAPICALL ctPointWrite(HANDLE,HANDLE,void*,DWORD,CTOVERLAPPED*); /* write to point handle */# extern BOOL CTAPICALL ctPointRead(HANDLE,HANDLE,void*,DWORD,CTOVERLAPPED*); /* read from point handle */# extern HANDLE CTAPICALL ctTagToPoint(HANDLE,LPCSTR,DWORD,CTOVERLAPPED*); /* convert tag into point handle*/# extern BOOL CTAPICALL ctPointClose(HANDLE,HANDLE); /* free a point handle */# extern HANDLE CTAPICALL ctPointCopy(HANDLE); /* copy a point handle */# extern BOOL CTAPICALL ctPointGetProperty(HANDLE,LPCTSTR,void*,DWORD,DWORD*,DWORD); /* get point property */# extern DWORD CTAPICALL ctPointDataSize(HANDLE); /* size of point data buffer */# extern DWORD CTAPICALL ctPointBitShift(HANDLE); /* calculate bit shift offset */# extern BOOL CTAPICALL ctPointToStr(HANDLE,BYTE*,DWORD,BYTE*,DWORD,DWORD); /* format point data to string */# extern BOOL CTAPICALL ctStrToPoint(HANDLE,LPCSTR,DWORD,BYTE*,DWORD,DWORD); /* format string data into point*/‘‘‘DONE extern BOOL CTAPICALL ctTagWrite(HANDLE,LPCSTR,LPCSTR); /* write to tag */‘‘‘‘‘‘DONE extern BOOL CTAPICALL ctTagRead(HANDLE,LPCSTR,LPSTR,DWORD); /* read from tag */‘‘‘# extern BOOL CTAPICALL ctEngToRaw(double*,double,CTSCALE*,DWORD); /* scale from eng to raw */# extern BOOL CTAPICALL ctRawToEng(double*,double,CTSCALE*,DWORD); /* scale from raw to eng */# extern BOOL CTAPICALL ctGetOverlappedResult(HANDLE,CTOVERLAPPED*,DWORD*,BOOL); /* get overlapped result */# extern BOOL CTAPICALL ctEngToRaw(double*,double,CTSCALE*,DWORD); /* scale from eng to raw */# extern BOOL CTAPICALL ctRawToEng(double*,double,CTSCALE*,DWORD); /* scale from raw to eng */# extern HANDLE CTAPICALL ctFindFirst(HANDLE,LPCTSTR,LPCTSTR,HANDLE*,DWORD); /* initiate a search */# extern BOOL CTAPICALL ctFindNext(HANDLE,HANDLE*); /* get the next search item */# extern BOOL CTAPICALL ctFindPrev(HANDLE,HANDLE*); /* get the prev search item */# extern DWORD CTAPICALL ctFindScroll(HANDLE,DWORD,LONG,HANDLE*); /* scroll to search item */# extern BOOL CTAPICALL ctFindClose(HANDLE); /* close a search */# extern LONG CTAPICALL ctFindNumRecords(HANDLE); /* get the total number of records in the search */# extern BOOL CTAPICALL ctGetProperty(HANDLE,LPCTSTR,void*,DWORD,DWORD*,DWORD); /* get a named property */# extern HANDLE CTAPICALL ctListNew(HANDLE,DWORD); /* create poll list */# extern BOOL CTAPICALL ctListFree(HANDLE); /* free poll list */# extern HANDLE CTAPICALL ctListAdd(HANDLE,LPCSTR); /* add tag to poll list */# extern BOOL CTAPICALL ctListDelete(HANDLE); /* delete tag from poll list */# extern BOOL CTAPICALL ctListRead(HANDLE,CTOVERLAPPED*); /* read poll list */# extern BOOL CTAPICALL ctListWrite(HANDLE,LPCSTR,CTOVERLAPPED*); /* write poll list item */# extern BOOL CTAPICALL ctListData(HANDLE,void*,DWORD,DWORD); /* get list data */# extern HANDLE CTAPICALL ctListEvent(HANDLE,DWORD); /* get list event */# extern BOOL CTAPICALL ctGetNumberOfLicenses(HANDLE, SHORT*, BYTE); /* Key Check CTAPI interface */
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。