通过CTAPI和Citect SCADA软件进行数据通讯
官方文档
Citect SCADA 7.20 Technical Reference
参考文献
基于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 platform
from ctypes import *
import sys if platform.system() != "Windows":
raise OSError class 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 */
Python代码
通过CTAPI和Citect SCADA软件进行数据通讯的更多相关文章
- SCADA软件整体架构
SCADA软件整体框架如下所示: 1.免费版本可以支持的IO容量为2048点,无运行时间限制. 2.免费版本仅支持本地Runtime运行,CLServer服务器只能运行24小时. 3.免费版本支持的驱 ...
- 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据)
首先安装网络监听软件 运行这个软件 这个软件安装到电脑上,默认是监听咱电脑上的网络通信 咱们先监听电脑的软件的网络通信数据,然后再说怎么监听Wi-Fi和APP的软件的网络通信数据 咱就监听咱基础篇的 ...
- R软件导入数据_r语言怎么导入数据_R软件导入数据
R软件导入数据_r语言怎么导入数据_R软件导入数据 R软件导入数据 1.Rcmdr安装包导入数据: 1.安装Rcmdr包,输入: install.packages("Rcmdr") ...
- WinCE数据通讯之SqlCE数据同步篇
上一篇总结了WinCE通过WebService进行数据通讯的交互方式,今天整理个SqlCE数据同步方式的内容.先说下软件环境:终端平台使用WinCE5.0+SqlCE2.0,服务器使用Windows ...
- 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)
我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...
- 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)
今天没有延续上一篇讲的内容,穿插一段小插曲,WebSocket 实时数据通讯同步的问题,今天我们并不是很纯粹地讲 WebSocket 相关知识,我们通过 WebGL 3D 拓扑图来呈现一个有趣的 De ...
- 通过 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)
我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...
- 【cocos2d-x + Lua(2) C++和lua数据通讯之间的互调】
我们主要解决如下几个问题: 转载注明出处:http://www.cnblogs.com/zisou/p/cocos2dx-lua2.html 1,C++如何获取Lua里面的一个变量值? 2,C++如何 ...
- [转]WINDOW进程间数据通讯以及共享内存
1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...
随机推荐
- C# 可访问一致性不一致
出现原因,其中一个是返回参数的访问级别小于函数的访问级别, 也就是说当定义一个返回参数的方法的时候,如果返回参数的访问级别低于方法的访问级别就会出现这样的错误,这个是可以理解的,如果返回的参数不能被访 ...
- python中的lambda表达
C++中的lambda表达式与C++11增加标准库,是一个简短的匿名的可调用对象,编译器会将其转化为一个匿名类的对象.lambda表达式的最大特点就是简短灵活.调用方便.它不须要处理非常复杂的逻辑.通 ...
- 再次轻度破解EXE文件
在经历股市多年的大起大落.大赚大赔之后.痛定思痛.深切感到在金融市场拼搏.必须建立健全交易纪律守则,严格运行. 这套完整的纪律守则,就是"交易系统". 在很多方面,它与一般的专家系 ...
- Java中List和ArrayList的区别(转)
List是一个接口,而ListArray是一个类. ListArray继承并实现了List. 所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造. ...
- telnet的使用
1.要打开 telnet 不是内部或外部 命令 解决方案: 程序添加删除功能,添加即可 或法二 C:\WINDOWS\system32\telnet.exe (或用C:\WINDOWS\system3 ...
- Java基础知识强化之集合框架笔记58:Map集合之LinkedHashMap类的概述
1. LinkedHashMap类的概述 LinkedHashMap:Map接口的哈希表(保证唯一性) 和 链接(保证有序性)列表实现,具有可预知的迭代顺序. 2. 代码示例: package cn. ...
- Eclipse - 添加 PyDev 插件
1. 安装PyDev插件 启用Eclipse.在Help菜单中,选择Install New Software···, 然后点击Add按钮.在Location中输入:http://pydev.org/u ...
- jquery.validate.js默认配置,jquery.validate.js自定义提示信息
jquery.validate.js默认配置,jquery.validate.js自定义提示信息 配置jQuery.validator默认的处理方法 >>>>>>& ...
- VS2010调试多进程--医疗His调试中使用
有些时候碰到自己开发的程序嵌入到别人的框架中,而在接口的地方出了问题,而又不方便将自己的模快加入到别人的工程中这个时候VS的附加到进程调试变得不可或缺了,直奔主题 http://msdn.micros ...
- width:100% 和 max-width:100%; 有区别吗【转藏】
这个博客是基于“Pelican+Markdown+定制的my-gum主题”的.定制的主题将博文正文页面的 右边栏去掉,这导致在Firefox等浏览器中,正文中大的图片会突破正文块的宽度,高度也得不到限 ...