网络继电器的EPICS IOC搭建
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搭建的更多相关文章
- [New learn] 网络基础-apache本地服务搭建(支持php)
1.简介 无网不利,无网不胜.对于移动应用来说离开网络那和咸鱼有什么分别?所以对于开发者来说更要学习好网络开发的技术. 2.搭建apache本地服务器 1.在finder中显示影藏的用户文件夹 fin ...
- 基于Ubuntu14.04下Suricata(一款高性能的网络IDS、IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐)
为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物理机器环境实验室的大数 ...
- 基于CentOS6.5下Suricata(一款高性能的网络IDS、IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐)
不多说,直接上干货! 为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物 ...
- linux中网络存储与考试系统搭建(实现多用户可以共享文件)
上期内容回顾 1.数据备份的方式有哪些 全量和增量 2.数据备份的命令有哪些 都有哪些优点缺点 cp : 本地复制,全量复制 scp : 远程复制,全量复制 rsync : 远程复制,增量复制 3.r ...
- 【网络】博客网站搭建之Typecho(命令版)
目录 前言 个人博客系统筛选 内网穿透 安装nginx 安装PHP 安装mysql Typecho 环境安装 参考 安装typecho Nginx与PHP进行连接配置&指定博客路径 验证 配置 ...
- UNIX网络编程卷1 - >环境搭建(ubuntu16.04)
学习unp网络编程,树上的例子均存在#include“unp.h”,故需要对环境进行配置. 1.到资源页下载www.unpbook.com 2.解压并将unpv13e移动到相应的文件夹下 (因为我 ...
- 搭建免费wifi,嗅探接入该wifi的所有网络信息
环境: 1: create_ap , 搭建免费wifi. 2: wireshark , 嗅探网络信息. 搭建热点 搭建热点: git clone https://github.com/oblique/ ...
- iOS网络1——NSURLConnection使用详解
原文在此 一.整体介绍 NSURLConnection是苹果提供的原生网络访问类,但是苹果很快会将其废弃,且由NSURLSession(iOS7以后)来替代.目前使用最广泛的第三方网络框架AFNetw ...
- openstack网络(neutron)模式之GRE的基本原理
neutron网络目的是为OpenStack云更灵活的划分网络,在多租户的环境下提供给每个租户独立的网络环境. neutron混合实施了第二层的VLAN和第三层的路由服务,它可为支持的网络提供防火墙, ...
- Maven学习 (四) 使用Nexus搭建Maven私服
为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到 ...
随机推荐
- 痞子衡嵌入式:MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制. 痞子衡之前写过一篇文章 <MCUXpresso I ...
- 关于CSDN博客上传图片的接口研究
代码实现 import requests from requests_toolbelt import MultipartEncoder import urllib.parse fields = { ' ...
- AI绘画提示词创作指南:DALL·E 2、Midjourney和 Stable Diffusion最全大比拼 ⛵
作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 自然语言处理实战系列:https://www.showmeai.tech ...
- 【每日一题】【递归实现、自下而上、优化】-2022年1月12日-NC68 跳台阶
描述一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果). 数据范围:0 \leq n \leq 400≤n≤40要求:时间复杂度: ...
- 【HBase】简介、结构、数据模型、快速入门部署、shell操作、架构原理、读写数据流程、数据刷写、压缩、分割、Phoenix、表的映射、与hive集成、优化
一.简介 1.定义 分布式.可扩展.支持海量数据存储的NoSQL数据库 2.数据模型 2.1逻辑结构 2.2物理存储结构 2.3数据模型介绍 Name Space:相当于数据库,包含很多张表 Regi ...
- K8S 核心组件 kubelet 与 kube-proxy 分析
kubelet kubelet 进程用于处理master 下发的任务, 管理pod 中的容器, 注册 自身所在的节点. 节点管理 启动参数说明 --register-node #如果设置为true 则 ...
- .net6+wpf制作指定局域网ip无法上网的arp欺诈工具
摘一段来自网上的arp欺诈解释:ARP欺骗(ARP spoofing),又称ARP毒化(ARP poisoning,网络上多译为ARP病毒)或ARP攻击,是针对以太网地址解析协议(ARP)的一种攻击技 ...
- Python全栈工程师之从网页搭建入门到Flask全栈项目实战(4) - Flask模板语法与继承
1.Flask模板介绍 前置:理解渲染机制即上篇笔记中render_template()功能是如何实现的! 1)找到html文件地址 2)读取html文件中的内容 3)替换html中的特殊字符 4)将 ...
- 使用pandas处理数据和matplotlib生成可视化图表
一.缘由 上一篇输入关键词"口红",将淘宝中的的相关商品信息全部爬取了下拉,并且以CSV的文件格式储存.我们拿到数据之后,那么就需要对数据进行处理.只是将爬取到的数据以更直观的方式 ...
- [编程基础] C++多线程入门1-创建线程的三种不同方式
原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 1 创建线程的三种不 ...