官方文档

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软件进行数据通讯的更多相关文章

  1. SCADA软件整体架构

    SCADA软件整体框架如下所示: 1.免费版本可以支持的IO容量为2048点,无运行时间限制. 2.免费版本仅支持本地Runtime运行,CLServer服务器只能运行24小时. 3.免费版本支持的驱 ...

  2. 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据)

    首先安装网络监听软件 运行这个软件 这个软件安装到电脑上,默认是监听咱电脑上的网络通信 咱们先监听电脑的软件的网络通信数据,然后再说怎么监听Wi-Fi和APP的软件的网络通信数据 咱就监听咱基础篇的 ...

  3. R软件导入数据_r语言怎么导入数据_R软件导入数据

    R软件导入数据_r语言怎么导入数据_R软件导入数据 R软件导入数据 1.Rcmdr安装包导入数据: 1.安装Rcmdr包,输入: install.packages("Rcmdr") ...

  4. WinCE数据通讯之SqlCE数据同步篇

    上一篇总结了WinCE通过WebService进行数据通讯的交互方式,今天整理个SqlCE数据同步方式的内容.先说下软件环境:终端平台使用WinCE5.0+SqlCE2.0,服务器使用Windows ...

  5. 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)

    我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...

  6. 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)

    今天没有延续上一篇讲的内容,穿插一段小插曲,WebSocket 实时数据通讯同步的问题,今天我们并不是很纯粹地讲 WebSocket 相关知识,我们通过 WebGL 3D 拓扑图来呈现一个有趣的 De ...

  7. 通过 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)

    我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...

  8. 【cocos2d-x + Lua(2) C++和lua数据通讯之间的互调】

    我们主要解决如下几个问题: 转载注明出处:http://www.cnblogs.com/zisou/p/cocos2dx-lua2.html 1,C++如何获取Lua里面的一个变量值? 2,C++如何 ...

  9. [转]WINDOW进程间数据通讯以及共享内存

    1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...

随机推荐

  1. uva 11195 Another queen (用状态压缩解决N后问题)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. /bin/bash^M: bad interpreter: 没有那个文件或目录--转载

    运行脚本时出现了这样一个错误,打开之后并没有找到所谓的^M,查了之后才知道原来是文件格式的问题,也就是linux和windows之间的不完全兼容...具体细节不管,如果验证: vim test.sh: ...

  3. Class Fxp\Composer\AssetPlugin\Repository\NpmRepository does not exist

    使用 composer 安装 laravel 时报错, 如下: [ReflectionException] Class Fxp\Composer\AssetPlugin\Repository\NpmR ...

  4. at91sam9x5 linux 4.1.0下dts驱动编程模型

    测试环境:  CPU: AT91SAM9X35      Linux: Atmel提供的linux-at91-linux4sam_5.3 (Linux-4.1.0) 转载请注明: 凌云物网智科嵌入式实 ...

  5. Installing the .NET Framework 4.5, 4.5.1

    This article provides links for installing the .NET Framework 4.5 and 4.5.1 on your computer.  If yo ...

  6. SQL 建立临时表进行查询

    SELECT min (maxrank) as minofmaxrank FROM (SELECT max(rank) as maxrank FROM tbl_core_staff WHERE st_ ...

  7. SqlServer 三级联动、递归表

    SqlServer 省市县三级联动 三张表递归合并成一张表sql如下: insert into table2(area_name,area_parent_id) select province,'0' ...

  8. sqlserver 启用邮箱服务

    1,打开数据库,找到管理 找到数据库邮件,单击右键选择配置 2,直接下一步 3. 4 填写基本的配置信息,邮箱密码不要写错了. 不然到时候发不出去邮件,也不会报错! 直接点击下一步.然后完成.. 到了 ...

  9. google map 定位

    在map初始化的过程中,得到当前经纬度,完成初始化地图,通过HTML5中的Geolocation实现,具体参考:http://www.jb51.net/html5/71556.html 1.获取当前地 ...

  10. 设置透明navigationBar

    三行代码轻松实现透明navigationBar:  [self.navigationController.navigationBar setBackgroundImage:[UIImage new] ...