通过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 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软件进行数据通讯

时间: 2024-10-13 06:45:07

通过CTAPI和Citect SCADA软件进行数据通讯的相关文章

SCADA软件整体架构

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

从软件导入数据功能, 看人员沟通问题

从软件导入数据功能, 看人员沟通问题 1 . 对于兼容性不好, 容错性也不好的软件,     a. 在导入数据时, 只能按软件要求的格式及规则进行操作.  一个规则或者格式不对的数据,就无法导入系统,并不给出任何提示信息.      就想人与人沟通, 有些人只能接受按自己的思维及方式的语言. 一旦那点不同, 即油烟不进,也不反馈沟通中的问题.   2. 对于兼容性好, 容错性不好的软件,  3. 对于兼容性不好, 容错性好的软件,  4. 对于兼容性好, 容错性好的软件, 

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

首先安装网络监听软件 运行这个软件 这个软件安装到电脑上,默认是监听咱电脑上的网络通信 咱们先监听电脑的软件的网络通信数据,然后再说怎么监听Wi-Fi和APP的软件的网络通信数据 咱就监听咱基础篇的 打开这个上位机 假设这个软件不是咱做的,IP什么信息都不知道,咱为了获取IP地址,咱不停的点击连接和断开 知道ip是 47.93.14.37以后咱设置一下过滤 ip.addr == 47.93.14.37 全部过滤出来了 咱清理软件的数据,同时断开上位机的连接,咱看一下这个上位机从一开始连接到发送和

系统分析员考试复习笔记-4:第四章 数据通讯与计算机网络

 1.      第四章数据通讯与计算机网络(P143) 计算机网络源于计算机技术与数据通讯技术的结合,它通过网络链路将分布在各个地理位置的多台独立的计算机相互连接起来,从而形成一种网络,并在网络操作系统.网络管理软件和网络通讯协议的管理和协调下,实现资源(硬件.软件和数据)共享. 1.1.      数据通讯基础知识 1.1.1.     信道特性 各种数据终端设备交换数据,必然要传输数据(模拟信号或者数字信号),数据传输的路径称为信道.信道可以分为物理信道和逻辑信道.物理信道由传输介质和

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

今天没有延续上一篇讲的内容,穿插一段小插曲,WebSocket 实时数据通讯同步的问题,今天我们并不是很纯粹地讲 WebSocket 相关知识,我们通过 WebGL 3D 拓扑图来呈现一个有趣的 Demo.接下来我们就看看这个实时数据通讯是一个什么样的套路. 我们先来聊聊这次 Demo 的思路吧,首先我要有一个 3D 的拓扑图组件,在上面创建几个节点,然后通过拉力布局(ForceLayout)将这些节点自动布局,但是有一定,需要在不同的网页窗口下,对应节点的位置是一样的,简单地说就是不同网页窗口

vue系列——组件数据通讯(一)

看博之前复习一遍关于组件数据通讯的官方文档:https://vuefe.cn/v2/guide/components.html vue的官方文档本身写的算是比较清楚的,此博作为要点总结和深入补充 关键词:父组件通过props传递数据给子组件,子组件通过event传递数据给父组件 (一)props 1. 基本用法 prop 是父组件用来传递数据的一个自定义属性 //父组件<template> <div id="app"> <myHeader :msg=&qu

vue系列——组件数据通讯(二)

VUEX: https://vuex.vuejs.org,官方文档先仔细看一遍,否则基础的东西不知道看下面的内容会吃力 关于vuex的使用场景,先抄官网一段话: 虽然 Vuex 可以帮助我们管理共享状态,但也附带了更多的概念和框架.这需要对短期和长期效益进行权衡. 如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的.确实是如此——如果您的应用够简单,您最好不要使用 Vuex.一个简单的 global event bus 就足够您所需了.但是,如果您需要构建是一个中大型单页应用,您很可

Android Wear开发 - 数据通讯 - 事件处理

http://developer.android.com/training/wearables/data-layer/events.html#Wait Section 1 : Wait for the Status of Data Layer Calls- 等待数据操作结果 You'll notice that calls to the data layer API sometimes return a PendingResult, such as putDataItem(). As soon

Android Wear开发 - 数据通讯 - 第三节 : 事件处理

http://developer.android.com/training/wearables/data-layer/events.html 以下是本人在学习官方开发文档时的笔记,主要是翻译为主,并在中间会插入一些自己的总结与研究,希望对读者有所帮助. 本文分为2大部分:Section1 : 如何获取数据通讯的结果.Section2 : 如何监听数据层中的数据事件.其中Section2分为2模块: 1. 继承WearableListenerService; 2. Activity实现数据接口.