C#读写欧姆龙PLC数据omron 使用TCP/IP FINS协议

2023-11-15

很多自动化设备使用OMRON PLC来控制制造过程,如果有SCADA 数据系统需要获取PLC的数据,甚至控制制造过程的参数,如加热温度,切割长度等,这需要一个中间层来执行这个任务,这个类就是为这种需求而设计的。
可以把它嵌入到你的应用中,让你更专注上层的业务,不用为底层的过程而烦恼。


需要注意的是,这个类使用的是同步sockets和PLC通信,这会阻塞当前线程。最好是单独为通信过程开一个子线程。可以看到,这个类没有使用对话框或者控制台消息,多数函数都是返回bool类型的值,你可以使用LastError()函数随时检查结果。


当前版本实现了以下3种类型的 PLC通信:

 

    [1,1] 内存区域读 finsMemoryAreaRead()
    [1,2] 内存区域写 finsMemoryAreaWrite()
    [5,1] 控制器数据读 finsConnectionDataRead()

DM 内存区域函数:

    ReadDM()
    ReadDMs()
    WriteDM()
    ClearDMs()

下图是按通道CH读取的数据寄存器DM100

 

 CIO 位内存区域函数:

    ReadCIOBit()
    ReadCIOBit()

下图是按位读取的内部输入输出继电器CIO bit

 

下图是按位读取的内部辅助继电器WR bit

 

仔细阅读 tcpFINSCommand.cs  很容易就可以添加新的读取其他元件的函数 。


使用方法

1.首先把 Omron.vx.xx.dll 用引用添加到你的工程


2.添加一个OMRON.OmronPLC实例变量,用new OMRON.OmronPLC(OMRON.TransportType.Tcp)初始化并
指定传输类型为TCP;

public partial class TestPLC : Form
{
    //
    // plc class
    //
    OMRON.OmronPLC plc;

    ///

    /// constructor
    ///

    public TestPLC()
    {
        InitializeComponent();

        // initielize a new plc object with tcp transport layer
        //
        this.plc = new OMRON.OmronPLC(OMRON.TransportType.Tcp);
    }
...


3.在使用Connect()连接PLC之前,必须设置好tcp连接参数,IP,端口。因为OmronPlc 使用的是接口类
,须强制转换至tcpFINSCommand 类,然后调用SetTCPParams 函数。

///

/// 连接PLC
///

private void Connect()
{
    if (ip.Text == "") return;
    if (port.Text == "") return;

    try
    {
        // set ip:port for command layer, may cast to tcpFINSCommand to set ip and port
        //
        OMRON.tcpFINSCommand tcpCommand = ((OMRON.tcpFINSCommand)plc.FinsCommand);
        tcpCommand.SetTCPParams(IPAddress.Parse(ip.Text), Convert.ToInt32(port.Text));
                
        // connection
        //
        if (! plc.Connect())
        {
            throw new Exception(plc.LastError);
        }
...
4.调用读取,写入函数。
类默认使用Byte, UInt16 and UInt32, and arrays的引用传递参数。
///

/// 读取单个 DM
///

private void ReadDM()
{
    if (dm_position.Text == "") return;
    UInt16 dmval=0;
    try
    {
        if (! plc.ReadDM(Convert.ToUInt16(dm_position.Text), ref dmval))
        {
            throw new Exception(plc.LastError);
        }

        dm_value.Text = dmval.ToString();
        
        dialog.Text = plc.LastDialog("READ DM");
        dialog.AppendText("DM VALUE: " + dmval.ToString());
    }
    catch (Exception ex)
    {
        MessageBox.Show("ReadDM() Error: " + ex.Message);
    }
}


如果要使用调试功能,你可以在发送命令后调用 LastDialog() 函数,
这样,你就能获取PC和PLC之间的十六进制对话数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#读写欧姆龙PLC数据omron 使用TCP/IP FINS协议 的相关文章

  • 调用许多网络服务的最佳方式?

    我有 30 家子公司 每家都实施了他们的 Web 服务 使用不同的技术 我需要实现一个Web服务来聚合它们 例如 所有子公司的Web服务都有一个名为的Web方法GetUserPoint int nationalCode 我需要实现我的网络服
  • 当从后台工作程序发生事件时,XlCall.Excel(XlCall.xlcCalculateNow) 抛出 XlCallException

    我有一个 ExcelFunction 来排队一些计算 ExcelFunction public static void QueueCalcs takes ranges var calcRequests builds list of calc
  • 当其源是 https uri 时如何使 wpf MediaElement 播放

    在 wpf 独立应用程序 exe 中 我在主窗口中包含了 MediaElement
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 无法获取本地或参数的值,因为它在此指令指针处不可用,可能是因为它已被优化掉

    Visual Studio 2010 会删除 没有其他词 不安全块中函数参数之一中的数据 什么可能导致此错误 调试器显示以下消息 Cannot obtain value of local or argument as it is not a
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • C++ 模板可以提供 N 个给定类的公共父类吗?

    我正在寻找一个 C 模板 它可以找到一组给定类的共同父级 例如 class Animal class Mammal public Animal class Fish public Animal class Cat public Mammal
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 对多个对象使用事件处理程序

    我有 20 件物品List
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • UE TSubclassOf

    定义 TSubclassOf
  • opencv中Mat矩阵的合并与拼接

    opencv如何将两个矩阵按行或者按列合并 在Matlab中将两个矩阵合并非常方便 按行合并 如A B C 按列合并如A B C 其实opencv有自带函数 vconcat和hconcat函数 用于矩阵的合并与图像的拼接 vconcat B
  • React中获取元素(ref获取方式)

    受控组件 在react中 input标签的部分属性受到react控制 如onChange是基于input 和change 事件进行封装 非受控组件 对于没有经历过封装的一些属性或者方法 可以通过ref去获取这个dom元素 再去获取或触发其自
  • 快速学会linux上的chrony服务

    文章目录 chrony服务 1 安装与配置 2 同步网络时间服务器 3 配置时间服务器 将本机作为服务器 4 chronyc命令 5 强制时区 chrony服务 Chrony 是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件 它
  • 智慧井盖监测管理系统解决方案

    一 方案概述 近年来 随着城市化的不断发展 城市地下管道设施的一步步完善 井盖作为城市基础设施中必不可少的一部分 其重要性也逐渐凸显 然而 在实际应用中 井盖监测和管理并不容易 如井盖地理位置分散 数量庞大 传统的巡检方式成本高 效率低 不
  • java定时器Timer的使用

    在JDK库中Timer类主要负责计划任务的功能 也就是在指定的时间开始执行某一个任务 Timer类的主要作用就是设置计划任务 但是封装任务的类的是TimerTask类 下面展示几个例子 在指定的日期执行一次某一任务 import java
  • C语言常用math函数

    算法笔记 第2章 fabs double x 对double型变量取绝对值 floor double x 和ceil double x 对double型变量进行向下取整和向上取整 pow double r double p 计算 r p r
  • 几种集中式管理框架比较

    最近因为项目管理上的需要 调研集中式管理工具 百度Disconf 携程Apollo 阿里ACM 三者都可以满足集中式配置 并提供监听 实时改变配置 关于3个框架的使用以及搭建请自行参考官方API文档 不再叙述 对比了3个框架的配置 如下 d
  • 精确时钟同步协议ptp/IEEE-1588v2协议-------(1)简介

    本文目录 1 从角色的角度来区分 2 从时钟类型的角度来区分 2 1 在IEEE 1588 2002中定义了普通时钟 OC ordinary clock 和边界时钟 BC boundary clock 这二种类型的时钟 2 2 在IEEE
  • 【neo4j】win10上利用neo4j-admin导入csv

    原因 我需要导入CN DBpedia到Neo4j中 包含900万 的百科实体以及6700万 的三元组关系 普通逐条插入可能速度太慢 所以要使用neo4j admin命令来进行导入 CN DBpedia原始数据直提供了txt格式的三元组数据
  • java系统增加查找算法详解

    题干 数学老师小y 想写一个成绩查询系统 包含如下指令 insert name score 向系统中插入一条信息 表示名字为name的学生的数学成绩为score find name 表示查找名字为name的学生的数学成绩 注意有些同学可能会
  • Rancher基础使用

    Rancher基础使用 安装 以下安装是在centos7 环境下 注意 生产环境建议在 Kubernetes 集群上安装 Rancher 因为在多节点集群中 Rancher Server 可以实现高可用 这种高可用配置可以提升访问下游集群的
  • 【流媒體】jrtplib—VS2010下RTP开源协议库JRTPLIB3.9.1编译

    流媒體 jrtplib VS2010下RTP开源协议库JRTPLIB3 9 1编译 SkySeraph Apr 7th 2012 Email skyseraph00 163 com 一 JRTPLIB简介 老外用C 编写的开源RTP协议库
  • matlab、C语言实现时域卷积运算

    背景 某次面试 岗位为音频算法 遇到了c语言实现卷积的编程题 当时不够精通c语言 写的程序比较垃圾 现在重新整理了一下 原理 卷积公式 matlab有自带的计算卷积的函数conv 根据公式 现编写实现卷积的函数并与自带函数做对比 关键点 假
  • 初步C++: g++: error: CreateProcess: No such file or directory

    问题 使用eclipse 环境 学习 c 出现如下错误 g error CreateProcess No such file or directory 经过百度查找 花了接近一天时间 始终找不到问题原因 今天下午出去上完 英语课回来的时候
  • 07-Java框架-SpringBoot整合MyBatis

    一 SpringBoot整合mybatis 1 1 添加依赖 创建springboot项目 添加依赖 编写启动类等 并在springboot依赖的基础上加入 mysql 和 springboot整合mybatis 的依赖 依赖对应关系参考官
  • Proxyee Down百度网盘高速下载器详细使用教程

    之前的Mac介绍毒了很多关于百度云提速的文章 但随着时间的推移 也都一一失效 今天再为大家带来一款百度云提速神器Proxyee Down 测试可以正常使用 速度也是非常的快 但不能保证所有资源下载正常 下面为大家整理详细的教程 希望大家可以
  • 更改jar包里的代码

    1 将class文件改成java文件 如果你的jar包中是包含源代码的 即包含java文件 请跳过此步 先将jar包通过winrar或者快压等解压缩软件将jar包解压缩 再通过一些专门的Java反编译工具将class文件转换为java文件
  • 如何将Android studio 的项目变成Lib工程,供项目使用

    最近公司项目比较松 在这里我优化项目时 突然想到就写一下关于项目怎么搞成lib包来给其他项目引用的过程 下面就是所有的步骤 说得很详细呢 1 先创建一个PersonLibDemo的一个Android项目 在这个项目创建一个类 方便测试在别
  • C#读写欧姆龙PLC数据omron 使用TCP/IP FINS协议

    很多自动化设备使用OMRON PLC来控制制造过程 如果有SCADA 数据系统需要获取PLC的数据 甚至控制制造过程的参数 如加热温度 切割长度等 这需要一个中间层来执行这个任务 这个类就是为这种需求而设计的 可以把它嵌入到你的应用中 让你