http://www.corxnet.com/product/showproduct.php?id=36

https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-21473915904.22.6e3c5ed08NWExp&id=520395007720

推荐这款可网络控制的继电器,16路继电器,16路IN,折腾了好几天在几位同事的帮助下终于把IOC调通了。基本的通过PV控制继电器的开关都调试成功,点控还没做,以后有空再做吧,如果看到的愿意做的可以继续做下去,不过labview程序把点控做好了,欢迎去下载:

https://gitee.com/lup9304/tuning-tools/blob/master/netio1.0.llb

这东西用起来很方便,比plc、西门子模块等方式搭建IO控制省事多了,一般的使用足够了,如果大电流大功率使用,可以自己外加继电器,用这个网络继电器控制外加的继电器即可。

具体怎么编译IOC,可以参看下面链接:

https://epics.anl.gov/modules/soft/asyn/R4-24/HowToDoSerial/HowToDoSerial_StreamDevice.html

需要socket通信,在上面链接里加dbd这一步时:HPE3631Atest_DBD += drvAsynSerialPort.dbd,换成:drvAsynIPPort.dbd就好了。

之后就是编写db、proto、st.cmd文件了。附上相关的文件,写的很不专业,欢迎大家下载使用并请修改的更简洁:

[ioc@localhost iocJDQ016]$ cat st.cmd 
#!../../bin/linux-x86_64/JDQ016

#- You may have to change JDQ016 to something else
#- everywhere it appears in this file

< envPaths

epicsEnvSet "P" "HALF:BD:"
epicsEnvSet "R" "IO:"
epicsEnvSet("ETHER","192.168.1.18:50000")

cd "${TOP}"

## Register all support components
dbLoadDatabase "dbd/JDQ016.dbd"
JDQ016_registerRecordDeviceDriver pdbbase

epicsEnvSet "STREAM_PROTOCOL_PATH" "$(TOP)/db"

# Set up ASYN ports
#vxi11Configure("L0", "$(ETHER)", 0, 0.0, "inst0", 0)
drvAsynIPPortConfigure("L0", "$(ETHER)", 0, 0, 0)

## Load record instances
#dbLoadRecords("db/xxx.db","user=ioc")
dbLoadTemplate "db/bo.substitutions"
#dbLoadRecords("db/devJDQ016.db","P=$(P),R=$(R),PORT=L0,A=0")

cd "${TOP}/iocBoot/${IOC}"
iocInit

#var streamDebug 1
## Start any sequence programs
#seq sncxxx,"user=ioc"
[ioc@localhost iocJDQ016]$

[ioc@localhost db]$ cat bo.substitutions
# Example substitutions file

file "db/devJDQ016.db" {
   pattern { P, R, PORT, A }
        { "HALF:", "BD:NetIO:", "L0", 0 }
}

file db/devJDQ016-bo.db {
    pattern { P, R, Chan, Next, PORT, A }
        { "HALF:", "BD:NetIO:", 0, 1, "L0", 0 }
        { "HALF:", "BD:NetIO:", 1, 2, "L0", 0 }
        { "HALF:", "BD:NetIO:", 2, 3, "L0", 0 }
        { "HALF:", "BD:NetIO:", 3, 4, "L0", 0 }
        { "HALF:", "BD:NetIO:", 4, 5, "L0", 0 }
        { "HALF:", "BD:NetIO:", 5, 6, "L0", 0 }
        { "HALF:", "BD:NetIO:", 6, 7, "L0", 0 }
        { "HALF:", "BD:NetIO:", 7, 8, "L0", 0 }
        { "HALF:", "BD:NetIO:", 8, 9, "L0", 0 }
        { "HALF:", "BD:NetIO:", 9, A, "L0", 0 }
        { "HALF:", "BD:NetIO:", A, B, "L0", 0 }
        { "HALF:", "BD:NetIO:", B, C, "L0", 0 }
        { "HALF:", "BD:NetIO:", C, D, "L0", 0 }
        { "HALF:", "BD:NetIO:", D, E, "L0", 0 }
        { "HALF:", "BD:NetIO:", E, F, "L0", 0 }
        { "HALF:", "BD:NetIO:", F, 0, "L0", 0 }
}

[ioc@localhost db]$

[ioc@localhost db]$ cat devJDQ016.db
#
# Simple database and stream protocol file for basic SCPI (IEEE488.2) commands
#

#
# Short and long form of identification string
#

record(mbbiDirect, "$(P)$(R)Relay:mbbiD")
{
        field(SCAN, "2 second")
        field(DESC, "Relay open or close state")
        field(DTYP, "stream")
        field(INP, "@devJDQ016.proto readRelayState $(PORT)")
        field(FLNK, "$(P)$(R)R1:bi")
}

record(mbbiDirect, "$(P)$(R)IN:mbbiD")
{
        field(SCAN, "2 second")
        field(DESC, "Input open or close state")
        field(DTYP, "stream")
        field(INP, "@devJDQ016.proto readInState $(PORT)")
        field(FLNK, "$(P)$(R)IN0:bi")
}

record(bo, "$(P)$(R)Relay:SetAll")
{
        field(DESC, "Control Relay open all")
        field(DTYP, "stream")
        field(OUT, "@devJDQ016.proto setAll $(PORT)")
        field(ZNAM,"closeAll")
        field(ONAM,"openAll")
        field(FLNK, "$(P)$(R)Relay:mbbiD")
}

[ioc@localhost db]$

[ioc@localhost db]$ cat devJDQ016-bo.db 
## Simple database and stream protocol file for basic SCPI (IEEE488.2) commands
#

#
# Short and long form of identification string
#

record(bi, "$(P)$(R)R$(Chan):bi")
{
        field(DESC, "lost phase state")
        field(INP,  "$(P)$(R)Relay:mbbiD.B$(Chan) NPP")
        field(ZNAM,"off")
        field(ONAM,"on")
        field(FLNK, "$(P)$(R)R$(Next):bi")
}

record(bi, "$(P)$(R)IN$(Chan):bi")
{
        field(DESC, "lost phase state")
        field(INP,  "$(P)$(R)IN:mbbiD.B$(Chan) NPP")
        field(ZNAM,"off")
        field(ONAM,"on")
        field(FLNK, "$(P)$(R)IN$(Next):bi")
}

record(bo, "$(P)$(R)R$(Chan):bo")
{
    field(DESC, "Set Relay Chan$(Chan)")
    field(DTYP, "stream")
    field(ZNAM,"close")
    field(ONAM,"open")
    field(OUT,  "@devJDQ016.proto setRelay$(Chan) $(PORT) $(A)")
    field(FLNK, "$(P)$(R)Relay:mbbiD")
}
[ioc@localhost db]$

[ioc@localhost db]$ cat devJDQ016.proto 
InTerminator = "";
OutTerminator = "";
setRelay0 {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x00\x01|\x00\x01\x00\x01}%2<sum>%2<sum>";
    in "%s";
}
setRelay1 {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x00\x02|\x00\x02\x00\x02}%2<sum>%2<sum>";
    in "%s";
}

setRelay2 {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x00\x04|\x00\x04\x00\x04}%2<sum>%2<sum>";
    in "%s";
}

setRelay3 {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x00\x08|\x00\x08\x00\x08}%2<sum>%2<sum>";
    in "%s";
}

setRelay4 {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x00\x10|\x00\x10\x00\x10}%2<sum>%2<sum>";
    in "%s";
}

setRelay5 {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x00\x20|\x00\x20\x00\x20}%2<sum>%2<sum>";
    in "%s";
}

setRelay6 {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x00\x40|\x00\x40\x00\x40}%2<sum>%2<sum>";
    in "%s";
}

setRelay7 {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x00\x80|\x00\x80\x00\x80}%2<sum>%2<sum>";
    in "%s";
}

setRelay8 {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x01\x00|\x01\x00\x01\x00}%2<sum>%2<sum>";
    in "%s";
}

setRelay9 {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x02\x00|\x02\x00\x02\x00}%2<sum>%2<sum>";
    in "%s";
}

setRelayA {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x04\x00|\x04\x00\x04\x00}%2<sum>%2<sum>";
    in "%s";
}

setRelayB {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x08\x00|\x08\x00\x08\x00}%2<sum>%2<sum>";
    in "%s";
}

setRelayC {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x10\x00|\x10\x00\x10\x00}%2<sum>%2<sum>";
    in "%s";
}

setRelayD {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x20\x00|\x20\x00\x20\x00}%2<sum>%2<sum>";
    in "%s";
}

setRelayE {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x40\x00|\x40\x00\x40\x00}%2<sum>%2<sum>";
    in "%s";
}

setRelayF {
    out "\xCC\xDD\xA1\x01%{\x00\x00\x80\x00|\x80\x00\x80\x00}%2<sum>%2<sum>";
    in "%s";
}

set {
    out "\xCC\xDD\xA1\x01\$1%2<sum>%2<sum>";
    in "%s";
}

setAll {
    out "\xCC\xDD\xA1\x01%{\x00\x00\xFF\xFF|\xFF\xFF\xFF\xFF}%2<sum>%2<sum>";
    in "%s";
}

readRelayState {
    wait 50;
    out "\xCC\xDD\xB0\x01\x00\x00\x0D\xBE\x7C";
    in "%*4c%2r[^\x0D]";
#    in "\xAA\xBB\xB0\x01%2r\x0D%2<sum>%2<sum>";
}

readInState {
    wait 50;
    out "\xCC\xDD\xC0\x01\x00\x00\x0D\xCE\x9C";
#    in "\xAA\xBB\xC0\x01%2x\x0D%2<sum>%2<sum>";
    in "%*4c%2r[^\x0D]";
}
[ioc@localhost db]$

网络继电器的EPICS IOC搭建的更多相关文章

  1. [New learn] 网络基础-apache本地服务搭建(支持php)

    1.简介 无网不利,无网不胜.对于移动应用来说离开网络那和咸鱼有什么分别?所以对于开发者来说更要学习好网络开发的技术. 2.搭建apache本地服务器 1.在finder中显示影藏的用户文件夹 fin ...

  2. 基于Ubuntu14.04下Suricata(一款高性能的网络IDS、IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐)

    为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物理机器环境实验室的大数 ...

  3. 基于CentOS6.5下Suricata(一款高性能的网络IDS、IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐)

    不多说,直接上干货! 为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物 ...

  4. linux中网络存储与考试系统搭建(实现多用户可以共享文件)

    上期内容回顾 1.数据备份的方式有哪些 全量和增量 2.数据备份的命令有哪些 都有哪些优点缺点 cp : 本地复制,全量复制 scp : 远程复制,全量复制 rsync : 远程复制,增量复制 3.r ...

  5. 【网络】博客网站搭建之Typecho(命令版)

    目录 前言 个人博客系统筛选 内网穿透 安装nginx 安装PHP 安装mysql Typecho 环境安装 参考 安装typecho Nginx与PHP进行连接配置&指定博客路径 验证 配置 ...

  6. UNIX网络编程卷1 - >环境搭建(ubuntu16.04)

      学习unp网络编程,树上的例子均存在#include“unp.h”,故需要对环境进行配置. 1.到资源页下载www.unpbook.com 2.解压并将unpv13e移动到相应的文件夹下 (因为我 ...

  7. 搭建免费wifi,嗅探接入该wifi的所有网络信息

    环境: 1: create_ap , 搭建免费wifi. 2: wireshark , 嗅探网络信息. 搭建热点 搭建热点: git clone https://github.com/oblique/ ...

  8. iOS网络1——NSURLConnection使用详解

    原文在此 一.整体介绍 NSURLConnection是苹果提供的原生网络访问类,但是苹果很快会将其废弃,且由NSURLSession(iOS7以后)来替代.目前使用最广泛的第三方网络框架AFNetw ...

  9. openstack网络(neutron)模式之GRE的基本原理

    neutron网络目的是为OpenStack云更灵活的划分网络,在多租户的环境下提供给每个租户独立的网络环境. neutron混合实施了第二层的VLAN和第三层的路由服务,它可为支持的网络提供防火墙, ...

  10. Maven学习 (四) 使用Nexus搭建Maven私服

    为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到 ...

随机推荐

  1. phpexcel 小技巧

    //设置填充的样式和背景色$objPHPExcel->getActiveSheet()->getStyle( 'A1:AU1')->getFill()->setFillType ...

  2. mysql 多个结构不同表查询 返回相同字段名

    ( select ID,数据库原字段名1 AS 统一字段名1,数据库原字段名2 AS 统一字段名2 from 第一个表名 WHERE 1) UNION(联合表查询)( select ID,数据库原字段 ...

  3. elasticsearch bucket 之rare terms聚合

    目录 1.背景 2.需求 3.前置准备 3.1 准备mapping 3.2 准备数据 4.实现需求 4.1 dsl 4.2 java代码 4.3 运行结果 5.max_doc_count 和 sear ...

  4. SVNAdmin2 - 基于web的SVN管理系统

    1. 介绍 SVNAdmin2 是一款通过图形界面管理服务端SVN的web程序. 正常情况下配置SVN仓库的人员权限需要登录到服务器手动修改 authz 和 passwd 两个文件,当仓库结构和人员权 ...

  5. SpringBoot内置tomcat启动过程及原理

    作者:李岩科 1 背景 SpringBoot 是一个框架,一种全新的编程规范,他的产生简化了框架的使用,同时也提供了很多便捷的功能,比如内置 tomcat 就是其中一项,他让我们省去了搭建 tomca ...

  6. python注释、变量、数据类型详细

    目录 1.python注释 2.PEP8规范 3.变量与常量 1.python中的变量 2.变量名的命名规范 3.常量的基本使用 1.python注释 什么是注释? 注释是对代码的解释说明,写注释是为 ...

  7. Docker的作用

    绝大部分应用,开发者都可以通过docker build创建镜像,通过docker push上传镜像,用户通过docker pull下载镜像,用docker run运行应用. 用户不需要再去关心如何搭建 ...

  8. Gorm源码学习-创建行记录

    1. 前言 Gorm源码学习系列 Gorm源码学习-数据库连接 此文是Gorm源码学习系列的第二篇,主要梳理下通过Gorm创建表的流程. 2. 创建行记录代码示例 gorm提供了以下几个接口来创建行记 ...

  9. 定制.NET 6.0的Middleware中间件

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 在本文中,我们将学习中间件,以及如何使用它进一步定制应用程序.我们将快速学习中间件 ...

  10. python之路27 单例模式实现方式、pickle模块、选课系统目录搭建

    单例模式实现的多种方式 单例1:(提前定义一个名字) class C1: __instance = None def __init__(self,name,age): self.name = name ...