跳转至

0.函数一览

说明

智能网关集成的Python环境版本为3.11.5,含众多第三方库,下位机软件版本≥1.4.02后支持,需要额外安装Python环境后使用,

Python和网关内置程序通过ctypes交互,ctypes官方说明链接

您可以:

1、使用python编写简单或复杂的计算、统计公式,将结果赋值到计算点中;

2、使用python编写PID控制、自适应控制、预测控制等闭环控制方法;

3、使用python个性化定制,开发自己的采集驱动与转发驱动,而不用等待研发开发;

4、使用vs code远程调试开发,精确定位代码bug;

5、使用python进行高级计算任务开发,例如矩阵计算、向量计算、线性代数计算、傅里叶变换、卷积、滤波、算法优化等。

部分源码

Python
import ctypes

C4PY_VERSION = "3"

#C语言接口函数名称
global_init = None      #全局资源初始化
global_release = None   #全局资源释放
clog_info = None        #打印clog日志
get_tag_value = None    #根据测点名称,取得测点实时值
get_tag_desc = None     #根据测点名称,取得测点物模型标识
get_chl_param = None    #根据通道名称,取得通道参数
get_dev_count = None    #根据通道名称,取得设备数量
get_dev_array = None    #根据通道名称,取得设备信息数组
get_tag_count = None    #根据设备名称,取得测点数量
get_tag_array = None    #根据设备名称,取得测点信息数组
set_tag_value = None    #根据测点名称,设置测点实时值
dset_tag_value1 = None  #根据设备名称+测点物模型标识,设置测点实时值
dset_tag_value2 = None  #根据设备名称+测点寄存器地址,设置测点实时值
set_chl_status = None   #设置通道状态
set_dev_status = None   #设置设备状态
msleep = None           #休眠,单位ms
dset_tag_qos1 = None    #根据设备名称+测点物模型标识,设置测点质量戳
dset_tag_qos2 = None    #根据设备名称+测点寄存器地址,设置测点质量戳

#结构体
#通道的串口参数结构体
class UartInfo(ctypes.Structure):
    _fields_ = [
        ("uart", ctypes.c_char * 16),       #串口名称,例如COM1
        ("baud", ctypes.c_int),             #波特率
        ("data_bit", ctypes.c_int),         #数据位,5、6、7、8
        ("stop_bit", ctypes.c_int),         #停止位,1、2
        ("check", ctypes.c_int),            #校验位,0无1奇2偶,3 MARK校验,4 SPACE校验
        ("timeout", ctypes.c_int),          #超时ms
        ("time_space", ctypes.c_int),       #帧间隔
        ("rev0", ctypes.c_char * 64),       #保留0
        ("rev1", ctypes.c_char * 64),       #保留1
        ("rev", ctypes.c_char * 344)        #保留
    ]
#通道的TCP参数结构体
class TCPInfo(ctypes.Structure):
    _fields_ = [
        ("role", ctypes.c_int),             #角色,0:客户端(主动连接),1:服务端(等待接入)
        ("port", ctypes.c_int),             #端口
        ("timeout", ctypes.c_int),          #超时ms
        ("ip_addr", ctypes.c_char * 128),   #ip地址/域名
        ("rev0", ctypes.c_char * 64),       #保留0
        ("rev1", ctypes.c_char * 64),       #保留1
        ("rev2", ctypes.c_char * 64),       #保留2
        ("rev3", ctypes.c_char * 64),       #保留3
        ("rev", ctypes.c_char * 116)        #保留
    ]
#设备信息结构体
class DeviceInfo(ctypes.Structure):
    _fields_ = [
        ("dev_name", ctypes.c_char * 64),           #设备名称
        ("dev_desc", ctypes.c_char * 64),           #设备描述
        ("dev_comm_addr", ctypes.c_char * 64),      #设备通讯地址
        ("dev_public_addr", ctypes.c_char * 64),    #设备公共地址
        ("dev_manu", ctypes.c_int),                 #兼容平台
        ("dev_model", ctypes.c_int),                #型号
        ("rev0", ctypes.c_char * 40),               #保留0
        ("rev1", ctypes.c_char * 32)                #保留1
    ]
#测点基础信息结构体
class TagBaseProp(ctypes.Structure):
    _fields_ = [
        ("tag_name", ctypes.c_char * 64),   #测点名称
        ("tag_desc", ctypes.c_char * 64),   #测点描述(物模型标识)
        ("tag_id", ctypes.c_int),           #测点id
        ("dev_id", ctypes.c_int),           #测点所属设备的id
        ("tag_type", ctypes.c_ushort),      #测点类型
        ("tag_rw", ctypes.c_ushort),        #测点读写属性
        ("init_value", ctypes.c_float),     #测点初始值
        ("tag_source", ctypes.c_ubyte),     #测点来源,0采集点,1中间点,2转发点,3系统点
        ("reserve", ctypes.c_char * 7)      #保留
    ]
#测点采集信息结构体
class TagCltProp(ctypes.Structure):
    _fields_ = [
        ("tag_k", ctypes.c_float),              #测点系数
        ("tag_b", ctypes.c_float),              #测点偏移
        ("collect_type", ctypes.c_int),         #采集功能码
        ("obj_addr", ctypes.c_char * 88),       #寄存器地址
        ("assist_param", ctypes.c_char * 8),    #辅助参数
        ("data_type", ctypes.c_int),            #数据类型
        ("data_format", ctypes.c_int),          #数据格式
        ("tag_group_index", ctypes.c_int),      #测点分组
        ("bit_get_value", ctypes.c_int),        #是否按位取值
        ("start_bit", ctypes.c_ushort),         #取值起始位
        ("end_bit", ctypes.c_ushort),           #取值终止位
        ("enable_trans", ctypes.c_int),         #是否开启数值转换
        ("org_read_value", ctypes.c_int),       #转换前的原始值
        ("trans_value", ctypes.c_int),          #转换后的值
        ("is_upload", ctypes.c_int),            #是否上传
        ("upload_pv_tag", ctypes.c_int),        #上传pv标识
        ("tag_k2", ctypes.c_float)              #上传pv系数
    ]
#测点报警信息结构体
class TagAlarmProp(ctypes.Structure):
    _fields_ = [
        ("enable_alarm", ctypes.c_int),         #报警总开关
        ("hh_enable_alarm", ctypes.c_int),      #开启高高报警
        ("h_enable_alarm", ctypes.c_int),       #开启高报警
        ("l_enable_alarm", ctypes.c_int),       #开启低报警
        ("ll_enable_alarm", ctypes.c_int),      #开启低低报警
        ("hh_alarm_value", ctypes.c_float),     #高高报警限值
        ("h_alarm_value", ctypes.c_float),      #高报警限值
        ("l_alarm_value", ctypes.c_float),      #低报警限值
        ("ll_alarm_value", ctypes.c_float),     #低低报警限值
        ("hh_alarm_msg", ctypes.c_char * 32),   #高高报警消息
        ("h_alarm_msg", ctypes.c_char * 32),    #高报警消息
        ("l_alarm_msg", ctypes.c_char * 32),    #低报警消息
        ("ll_alarm_msg", ctypes.c_char * 32),   #低低报警消息
        ("dead_area_value", ctypes.c_float),    #报警死区
        ("alarm_level", ctypes.c_ushort),       #报警等级
        ("kg_change_mode", ctypes.c_ushort),    #开关量报警
        ("kg_alarm_msg", ctypes.c_char * 32)    #开关报警消息
    ]
#测点历史信息结构体
class TagHisProp(ctypes.Structure):
    _fields_ = [
        ("enable_his_save", ctypes.c_int),      #开启历史存储
        ("save_type", ctypes.c_int),            #存储方式,0周期存储1压缩存储
        ("his_save_interval", ctypes.c_int),    #存储间隔,秒
        ("comp_perc", ctypes.c_float)           #压缩精度
    ]
#测点汇总信息结构体
class TagInfo(ctypes.Structure):
    _fields_ = [
        ("base", TagBaseProp),                                  #测点基本信息结构体
        ("clt", TagCltProp),                                    #测点采集信息结构体
        ("alarm", TagAlarmProp),                                #测点报警信息结构体
        ("his", TagHisProp),                                    #测点历史信息结构体
        ("p_tag_value", ctypes.POINTER(ctypes.c_float)),        #测点实时数据指针
        ("p_tag_quality", ctypes.POINTER(ctypes.c_int)),        #测点实时质量指针
        ("p_tag_str_value", ctypes.POINTER(ctypes.c_char)),     #测点字符串类型实时值指针
        ("p_collect_time", ctypes.POINTER(ctypes.c_longlong))   #测点采集到数据的时间指针
    ]

#通道、设备状态
RUN_STAT_INIT   = 0 #正在初始化中,网关刚启动时的默认状态
RUN_STAT_NORMAL = 1 #正常工作状态
RUN_STAT_FAULT  = 2 #异常状态
RUN_STAT_STOP   = 3 #正常停止状态(例如其它进程打开了串口调试,那么本通道会临时暂停)
RUN_STAT_UPDATE = 4 #正在升级中(本通道正在对下属子设备进行固件升级)

#测点质量
TAG_QUALITY_GOOD    = 0     #测点质量戳好
TAG_QUALITY_BAD     = 100   #测点质量戳坏
TAG_QUALITY_SET     = 49    #测点质量戳为人工置数
TAG_QUALITY_INVALID = 50    #测点质量戳无效,即没有初始化过

#测点读写属性
TAG_RO = 0  #只读
TAG_RW = 1  #读写
TAG_WO = 2  #只写

#测点类型
TAG_YC = 0  #遥测,模拟量
TAG_YX = 1  #遥信,开关量
TAG_YM = 2  #遥脉
TAG_YK = 3  #遥控
TAG_YT = 4  #遥调

#测点数据类型
TAG_DATA_TYPE_BIT       = 0     #位
TAG_DATA_TYPE_UCHAR     = 1     #8位无符号
TAG_DATA_TYPE_CHAR      = 2     #8位有符号
TAG_DATA_TYPE_UINT      = 3     #16位无符号
TAG_DATA_TYPE_INT       = 4     #16位有符号
TAG_DATA_TYPE_ULONG     = 5     #32位无符号
TAG_DATA_TYPE_LONG      = 6     #32位有符号
TAG_DATA_TYPE_BCD       = 7     #16位BCD
TAG_DATA_TYPE_LONGBCD   = 8     #32位BCD
TAG_DATA_TYPE_FLOAT     = 9     #单精度浮点数
TAG_DATA_TYPE_DOUBLE    = 10    #双精度浮点数
TAG_DATA_TYPE_STRING    = 11    #字符串
TAG_DATA_TYPE_UINT64    = 12    #64位无符号
TAG_DATA_TYPE_INT64     = 13    #64位有符号

#测点数据格式
TAG_DATA_FORMAT_V0 = 0  #HL,12
TAG_DATA_FORMAT_V1 = 1  #LH,21
TAG_DATA_FORMAT_V2 = 2  #HLhl,1234
TAG_DATA_FORMAT_V3 = 3  #LHlh,2143
TAG_DATA_FORMAT_V4 = 4  #hlHL,3412
TAG_DATA_FORMAT_V5 = 5  #lhLH,4321

#测点报警类型
TAG_ALARM_NO     = 0    #无报警
TAG_ALARM_HH     = 1    #高高报警
TAG_ALARM_H      = 2    #高报警
TAG_ALARM_L      = 3    #低报警
TAG_ALARM_LL     = 4    #低低报警
TAG_ALARM_KG_K   = 5    #开报警
TAG_ALARM_KG_G   = 6    #关报警
TAG_ALARM_KG_B   = 7    #开关变位报警

示例

Python
    # 在脚本中导入c4py库
    import c4py
    # 使用c4py库
    c4py.py_load_so()
    # 初始化
    c4py.global_init()
    # 打印
    c4py.clog_info(b"hello from python!")
    # 资源释放
    c4py.global_release()