欧姆龙NJ1P2 Fins Udp通讯

news2024/11/24 7:29:51

NJ1P2 Tcp连接不成功,咨询客服说不支持Fins Tcp,所以改成Udp方式。

Udp连接:

 locateIp = IPAddress.Parse(txtLocateIP.Text);
            locatePoint = new IPEndPoint(locateIp, Convert.ToInt32(txtLocatePort.Text));
            udpClient = new UdpClient(locatePoint);
 

Fins通讯主要是报文格式

上位机发送 FINS UDP 命令读写 PLC 数据.pdf

 使用 0101 代码读 D100 的数据,命令如下: 0101(读代码)82(DM 地址代码)006400(D100)0001(1 个数据)

DM区 代码:82  W区bit : 31      字:B1       

006400  =》 D100  实际地址(需要在PLC上 全局变量里分配到

指定 实际地址   W区的0.01就是0地址的第1位,0.00是0地址的第0位

用 0102 代码写 W0.05 为 ON,命令如下: 0102(写代码)31(W 位地址代码)000005(W0.05)0001(1 个数据)01(ON)

读 D100 数据,完整命令如下: 800002(固定)  000300(PLC节点)00C000(计算机节点)00(结束)0101(读数据)82(DM区)006400(实际地址 D100)0001(长度)

反馈:

C00002 00C000(计算机节点) 000300(PLC 节点) 00 0101(读数据) 0000(正常反馈) 0123(数据)

写 W0.05 完整命令如下: 800002  000300  00C000  00  0102   31  000005  0001 01

比较大的整数和浮点数,长度是2位,4个字节。需要CDAB格式转换一下

  byte[] newdataa = new byte[4];
                            newdataa[0] = Num[2];
                            newdataa[1] = Num[3];
                            newdataa[2] = Num[0];
                            newdataa[3] = Num[1];
                            if (BitConverter.IsLittleEndian) Array.Reverse(newdataa);
                            int intFinish = BitConverter.ToInt32(newdataa, 0);

欧姆龙PLC的FINS协议解释
UDP访问方式:
读取示例:读取DM区20个字, 从DM100H开始
命令:80 00 02 00 41 00 00 0B 00 00 01 01 82 00 64 00 00 14
说明:
80 00 02       固定帧头
00 41 00       设备的网络号,节点号,单元号
00 0B 00       PC的网络号,节点号,单元号
00 01 01        SID+MRC+SRC
82 表示DM区
00 64 首地址
00 固定
00 14 读取数量
响应: D100=0x1388, D101=0x1770, D102=0x1b58
c0 00 02 00 0b 00 00 41 00 00 01 01 00 00 13 88 17 70 1b 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
说明:
C0 00 02    固定帧头
00 0B 00     PC网络号,节点号,单元号
00 41 00     设备网络号,节点号,单元号
00 01 01     SID+MRC+SRC
00 00
数据区:
 13 88 17 70 1b 58 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
————————————————
 

另一种协议Cip  标签方式:直接读取写入全局变量

demo:UCMM

//1.注册会话ID

            byte[] registerSessionCommand = new byte[]
            {
                //--------------------------------------------------------Header 24byte-------------------------------------
  0x6F,0x00,//命令 2byte
  0x04,0x00,//Header后面数据的长度 2byte
  0x00,0x00,0x00,0x00,//会话句柄 4byte
  0x00,0x00,0x00,0x00,//状态默认0 4byte
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//发送方描述默认0 8byte
  0x00,0x00,0x00,0x00,//选项默认0 4byte
    //-------------------------------------------------------CommandSpecificData 指令指定数据 4byte
  0x01,0x00,//协议版本 2byte
  0x00,0x00,//选项标记 2byte
            };


            //2.提取会话ID-注册请求的应答报文

            byte[] RefRegisterCmd = new byte[28]
{

    //--------------------------------------------------------Header 24byte-------------------------------------
    0x6F, 0x00,//命令 2byte
    0x04, 0x00,//CommandSpecificData的长度 2byte
    0x6B, 0x01, 0x01, 0x00,//会话句柄 4byte 由PLC生成
    0x00, 0x00, 0x00, 0x00,//状态默认0 4byte
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,//发送方描述默认0 8byte
    0x00, 0x00, 0x00, 0x00,//选项默认0 4byte

    //-------------------------------------------------------CommandSpecificData 指令指定数据 4byte

    0x01, 0x00,//协议版本 2byte
    0x00, 0x00,//选项标记 2byte
};
            byte[] SessionHandle = new byte[4] { 0x6B, 0x01, 0x01, 0x00 };//从应答报文提取的会话ID:索引4开始,查找4个字节


            //------------------3.读数据服务请求报文-------------------------

            //报文由三部分组成 Header 24个字节 、CommandSpecificData 16个字节、以及CIP消息(由读取的标签生成)实例,
            //读取单个标签名为 TAG1的报文总长度为64个字节
            byte[] Header = new byte[24]
{
0x6F,0x00,//命令 2byte
  0x28,0x00,//长度 2byte(总长度-Header的长度)=40 
  0x6B,0x01,0x01,0x00,//会话句柄 4byte
  0x00,0x00,0x00,0x00,//状态默认0 4byte
  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//发送方描述默认0 8byte
  0x00,0x00,0x00,0x00,//选项默认0 4byte
};
            byte[] CommandSpecificData = new byte[16]
{
0x00,0x00,0x00,0x00,//接口句柄 CIP默认为0x00000000 4byte
  0x01,0x00,//超时默认0x0001 4byte
  0x02,0x00,//项数默认0x0002 4byte
  0x00,0x00,//空地址项默认0x0000 2byte
  0x00,0x00,//长度默认0x0000 2byte
  0xb2,0x00,//未连接数据项默认为 0x00b2
  0x18,0x00,//后面数据包的长度 24个字节(总长度-Header的长度-CommandSpecificData的长度)
};

            byte[] CipMessage = new byte[24]
{

 0x52,0x02,     //服务默认0x52  请求路径大小 默认2

0x22,0x06,0x24,0x01,//请求路径 默认0x01240622 4byte
  0x0A,0xF0,//超时默认0xF00A 4byte
  0x0A,0x00,//Cip指令长度  服务标识到服务命令指定数据的长度 
  0x4C,//服务标识固定为0x4C 1byte  
  0x03,// 节点长度 2byte  规律为 (标签名的长度+1/2)+1
  0x91,//扩展符号 默认为 0x91
  0x04,//标签名的长度

  0x54,0x41,0x47,0x31,//标签名 :TAG1转换成ASCII字节 当标签名的长度为奇数时,需要在末尾补0  比如TAG转换成ASCII为0x54,0x41,0x47,需要在末尾补0 变成 0x54,0x41,0x47,0


0x01,0x00,//服务命令指定数据 默认为0x0001 

   0x01,0x00,0x01,0x00//最后一位是PLC的槽号

};
            //PLC回复报文:
            //6F00 1800 6B010100 00000000 0000000000000000 00000000 00000000 0100 0200 00000000 B200

            //实例,读取多个标签名为 TAG、TAG1的报文总长度为86个字节
            //6F003E006B01010000000000000000000000000000000000000000000100020000000000B2002E005202200624010AF020000A02200224010200060010004C0391035441470001004C03910454414731010001000100

            //Header:6F003E006B01010000000000000000000000000000000000      24byte

            //CommandSpecificData: 00 00 00 00 0100020000000000B2002E00     16byte
            /*
            CipMessage:
            -服务代码 - 请求路径大小 - 请求路径  0AF0超时   20 00 CIP指令长度 (0A - 00之间的长度为32个字节)
            -请求路径大小  请求路径 0200 标签的数量  0600 偏移量(初始值为:2 + 标签数量 * 2)
            1000 偏移量 = 标签服务长度 + 初始偏移量(有几个标签就有几个偏移量)
            4C 03 91 03 54414700 0100  标签TAG  4C039104544147310100 标签TAG1

            PLC回复报文:
            6F00006B01010000000000000000000000000000000000000000000100020000000000B200008A000000020006001300CC000000D00005003232323232CC000000D00005003232323232    76byte

            Header:6F0034006B01010000000000000000000000000000000000  24byte
            CommandSpecificData:000000000100020000000000B2002400  16byte
            CipMessage:    CC000000D00005003232323232
            8A - 多个标签   0000 - 状态  0200 - 项数  0600 - 标签TAG偏移量  1300 - 标签TAG1偏移量  0000 - 状态0正常 D000 - 数据类型:string
            0500:字符串长度(字符串类型特有的)
            3232323232 - 数据 "22222":
            目前常用的数据类型: C1 - BOOL C2 - SINT C3 - Short C4 - Int  C7 - UShort C8 - UInt  CA - Float CB - Double  D0 - String
            */


            //-----------------4.写入数据服务报文--------------------------
            /*实例,往标签名为:TAG1 写入true  数据类型为 bool

            写入报文:68byte

            6F002C006B01010000000000000000000000000000000000 000000000100020000000000B2001C00 5202200624010AF00E004D03910454414731C1000100010001000100

            header:6F002C006B01010000000000000000000000000000000000   24byte
            CommandSpecificData:000000000100020000000000B2001C00     16byte


            20062401 0AF0  0E00 4D 03 91 04 54414731 C100 0100 0100 01000100   28byte

            -请求路径大小  20062401-请求路径,默认   0AF0-超时           0E00-CIP指令长度(绿色部分的长度)

            4D-写入标识     03-(标签名的长度+1)/2+1   91-扩展符号    04-标签TAG1的长度   54414731 -标签名的ASCII表示

            C100-数据类型    0100-默认项   0100-数据 TRUE(2byte)          01000100 - 默认最后一位为PLC槽号

            PLC回复报文:

            6F0014006B0101 00000 00000000000000000000000000000 000000000100020000000000B2000400CD000000   44byte

            header:6F0014006B01010000000000000000000000000000000000 24byte

            CommandSpecificData:000000000100020000000000B2000400  16byte

            CIPMessage:CD 00 0000     CD-服务标识  00-填充字节  0000-状态好

            注意:当写入字符串类型时,写入的数据长度为奇数时,需要在数据后填充一个字节0,必须为偶数
            */

            //----  5.扩展知识----------------------
            /*首先建立起TCP连接,CIP通信端口默认为44818。TCP连接成功后,发送会话消息,获取四个字节的会话ID,就可以正常读写了。

000000000000000000000000000000 24byte


 0x0000:状态正常(在报文里低位在前高位在后)


 0x0001:发出了无效或不受支持的封装命令;

            0x0002:接收器中的内存资源不足,无法处理命令;

            0x0003:封装消息的数据部分中的数据形成不良或不正确;

            0x0004:Reserved for legacy(RA);

            0x0064:向目标发送封装消息时,始发者使用了无效的会话句柄;

            0x0065:目标收到一个无效长度的信息

0x0069:不支持的封装协议修订


0x0000 - 成功


0x0004 - 它没有正确生成或匹配标记不存在


0x0005 - 引用的特定项(通常是实例)无法找到


0x0006 - 请求的数据量不适合响应缓冲区。 发生了部分数据传输


0x000A - 尝试处理其中一个属性时发生错误


0x0013 - 命令中没有提供足够的命令数据 / 参数来执行所请求的服务


0x001C - 与属性计数相比,提供的属性数量不足


0x001E - 此服务中的服务请求出错


0x0020 - 命令中参数的数据类型与实际参数的数据类型不一致


0x0026 - IOI字长与处理的IOI数量不匹配*/

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/748117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刷题记录02

题目1 解析: 遍历字符串,使用cur去记录连续的数字串, 如果遇到不是数字字符,则表示一个连续的数字串结束了, 则将数字串跟之前的数字串比较,如果更长,则更新更长的数字串更新到ret。 具体代码: import jav…

线上阿里云短信盗刷问题实录

背景 营销系统中有定时任务处理将待支付订单变更为已取消,执行时间五分钟一次.业务执行处理异常会发送短信给相关开发人员进行短信提醒.从下午一点二十五开始,开发人员间隔五分钟就会收到业务执行异常的短信提醒.最初因为测试或是正式环境中确实有异常的业务,才会出现这个情况,…

C++结合EasyX写扫雷(new)

【游戏】C结合EasyX写扫雷(时隔半年后重写) 上一次写扫雷这一次实现思路设置全局变量Grid类Grid类的成员函数启动画面死循环监听鼠标事件 全部代码其他 上一次写扫雷 大约半年之前的寒假期间,我接触了EasyX这个图形库,于是试着写…

antd design 4 版本,表格操作列文字间隔小竖线

组件库可以直接使用 <Divider typevertical /> 时小记&#xff0c;终有成。

23 MFC 富文本

文章目录 ui 设置 使用AfxInitRichEdit2(); 初始化否则不显示 //初始化 BOOL CnotePadDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 设置此对话框的图标。 当应用程序主窗口不是对话框时&#xff0c;框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标…

数学建模——TOPSIS法

TOPSIS法&#xff08;Technique for Order Preference by Similarity to ldeal Solution&#xff09; 可翻译为逼近理想解排序法&#xff0c;国内常简称为优劣解距离法 TOPSIS法是一种常用的综合评价方法&#xff0c;其能充分利用原始数据的信息&#xff0c;其结果能精确的反应…

一款基于JAVA开发的Echarts后台生成框架

目录 前言 一、Echarts后台生成框架 1、简介 2、开源地址 3、支持类型 二、图表生成实战 1、项目使用 2、后台折线图生成 3、Echarts改造 4、最终效果 总结 前言 之前的博文主要分享了一些关于Echarts的基本开发知识&#xff0c;在之前的博客中主要介绍的是在前端页面进…

魏副业而战:她又办了2套图书证

我是魏哥&#xff0c;与其躺平&#xff0c;不如魏副业而战&#xff01; 社群成员董姐又办了2套图书证&#xff0c;加上之前的1套&#xff0c;她已经有3套图书证了。 3套图书证意味着可以开9个闲鱼图书店铺。是不是感觉很NB。 董姐说&#xff0c;2套图书证等了快一个多月&…

Flink基本原理剖析讲解

1.Flink简介 Flink是一个批处理和流处理结合的统一计算框架&#xff0c;其核心是一个提供了数据分发以及并行化计算的流数据处理引擎。它的最大亮点是流处理&#xff0c;是业界最顶级的开源流处理引擎。 Flink最适合的应用场景是低时延的数据处理&#xff08;Data Processing…

面试题更新之-伪元素和伪类

文章目录 伪元素和伪类是什么&#xff1f;伪元素&#xff08;Pseudo-elements&#xff09;:伪类&#xff08;Pseudo-classes&#xff09;: css伪元素和伪类的区别使用css伪元素的好处使用css伪类的好处 伪元素和伪类是什么&#xff1f; 在CSS中&#xff0c;伪元素&#xff08;…

星云零售信贷基于 Apache Doris 的 OLAP 演进之路

本文导读&#xff1a; 腾梭科技是国内领先的零售金融数字化及安全服务提供商&#xff0c;是腾讯投资且在金融领域的战略合作伙伴&#xff0c;并与腾讯联合研发了“星云智慧信贷解决方案。在其信贷业务转型过程中&#xff0c;随着系统规模不断扩大&#xff0c;早期架构无法再满…

centos7根分区、文件系统扩容

1、 输入lsblk&#xff0c;查看到新硬盘sde&#xff0c;根目录现71G. 2、 创建分区fidisk /dev/sde 3、 刷新分区 partprobe /dev/sde&#xff0c;并创建物理卷 pvcreate /dev/sde1 4、 查看卷组名 vgdisplay 5、 将物理卷扩展到卷组 vgextend centos /dev/sde1 6、 查看逻辑巻…

linux系统安装步骤教程详解

linux是现在常用的一类操作系统&#xff0c;我们可以通过U盘、光驱、或者虚拟机进行安装。 具体步骤如下&#xff1a; 1.去https://www.centos.org/download/下载centos系统&#xff0c;其中CentOS-7.0-x86_64-DVD-1503-01.iso 是标准安装版&#xff0c;推荐下载这个; 2.使用U盘…

OCR技术的昨天今天和明天!2023年最全OCR技术指南!

OCR是一项科技革新&#xff0c;通过自动化大幅减少人工录入的过程&#xff0c;帮助用户从图像或扫描文档中提取文字&#xff0c;并将这些文字转换为计算机可读格式。这一功能在许多需要进一步处理数据的场景中&#xff0c;如身份验证、费用管理、自动报销、业务办理等都显得尤为…

MySQL常见笔试题

前言 数据库的考察在面试时可是十分常见的&#xff0c;MySQL作为一种常用的关系型数据库管理系统&#xff0c;对于它的介绍在面试时可是必不可少的&#xff0c;下面就是一些常见笔试题的模拟&#xff0c;希望可以帮助到你&#x1f642;&#x1f642; 所用到的表如下&#xff…

国产MCU-CW32F030开发学习-BH1750模块

国产MCU-CW32F030开发学习-BH1750模块 硬件平台 CW32_48F大学计划板CW32_IOT_EVA物联网开发评估套件BH1750数字型光照强度传感器 BH1750 BH1750是一款数字型光照强度传感器&#xff0c;能够获取周围环境的光照强度。其测量范围在0~65535 lx。lx勒克斯&#xff0c;是光照强…

界面设计利器!10款Sketch插件合集,助你事半功倍!

在界面设计领域&#xff0c;Sketch以其高效、小巧的优势获得了不少设计团队的喜爱&#xff0c;帮助全球设计师创造了许多不可思议的作品。在使用Sketch的过程中&#xff0c;辅助使用一些Sketch插件&#xff0c;可以让我们更加高效地完成设计任务。本篇文章&#xff0c;我们将揭…

torch分布式通信基础

torch分布式通信基础 1. 点到点通信2. 集群通信 官网文档&#xff1a;WRITING DISTRIBUTED APPLICATIONS WITH PYTORCH 1. 点到点通信 # 同步&#xff0c;peer-2-peer数据传递 import os import torch import torch.distributed as dist import torch.multiprocessing as mpdef…

热点探测技术架构设计与实践

1. 概述 说到热点问题&#xff0c;首先我们先理解一下什么是热点&#xff1f; 热点通常意义来说&#xff0c;是指在一段时间内&#xff0c;被广泛关注的物品或事件&#xff0c;例如微博热搜&#xff0c;热卖商品&#xff0c;热点新闻&#xff0c;明星直播等等&#xff0c;所以…

领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…