C#上位机与欧姆龙PLC的通信07----使用第3方通讯库读写数据

1、介绍 

       FINS (factory interface network service)通信协议是欧姆龙公司开发的用于工业自动化控制网络的指令/响应系统。运用FINS指令可实现各种网络间的无缝通信,通过编程发送FINS指令,上位机或PLC就能够读写另一个PLC数据区的内容,甚至控制其运行状态,从而简化了用户程序。FINS协议支持工业以太网,这就为OMRONPLC与上位机以太网通信的实现提供了途径。
       在上节内容C#上位机与欧姆龙PLC的通信06---- HostLink协议(FINS版),我们熟悉了协议报文结构,知道了如何发送命令,接收命令,但是那是为了了解它的报文组成部分,在应用层开发中,我们是不可能直接发送报文来获取数据的,应该使用第3方的通讯库来与PLC通信或者自己写通讯库,这节介绍一个与欧姆龙PLC进行FINS通信的通讯库,也就是说别人写好的代码,只要拿来用就可以了,当然超人,高手需要封装自己的通讯库,下节来写自己的通讯库,这节先熟悉别人的通讯库怎么用,以丰满自己的肌肉。不管是别人写的通讯库还是自己写的通讯库,里面通信的过程和报文都是上节讲的那些结构,只是你看不到。

      开发环境采用vs2022,编写控制台程序,通讯库的名称叫“omronfinstcp.net” ,必须先安装好vs2022。

2、开始干

1、创建项目OmronFinsConsoleApp

2、添加引用

3、连接PLC

编写代码:

 static void Main(string[] args)
 {
     Console.WriteLine("Hello World!");
     //创建实例
     OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
     //连接plc,5000是超时时间
    var rt=  etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
     Console.WriteLine("连接成功!");

     Console.ReadKey();

 }

可以看到是不是很简单,这是使用通讯库的好处,不要拼什么报文

4、 读取和写入CIO区的2进制数据

1、读取CIO0.0开始的6个数据

程序代码:

 static void Main(string[] args)
 {
     Console.WriteLine("Hello World!");
     //创建实例
     OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
     //连接plc,5000是超时时间
    var rt=  etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
     Console.WriteLine("连接成功!");

     Console.WriteLine("读取bool一个");
     short bvalue = 0;
     etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.0", out bvalue);
     Console.WriteLine("CIO区0.0:" + bvalue);
     etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.3", out bvalue);
     Console.WriteLine("CIO区0.3:" + bvalue);

     Console.WriteLine("读取bool多个");
     short bvalue1 = 0;
     for (int i = 0; i < 6; i++)
     {
         etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), out bvalue1);
         Console.WriteLine("CIO区0中的" + (i).ToString() + "=" + bvalue1);
     }  
     Console.ReadKey(); 
 }

注意:这个通讯库有不完善的地方,读取多个bool时,他没有提供对应的方法,他只能读取一个,读取多个,自然要使用循环,所以说别人的库有不完善的地方,下节我自己写的通讯库,比这个强大。

查看报文

 2、 写入指令,写入CIO区0.0开始的6个bool数据true, true, true, true, true,true

程序代码

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");
    //创建实例
    OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
    //连接plc,5000是超时时间
   var rt=  etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
    Console.WriteLine("连接成功!");

    //Console.WriteLine("读取bool一个");
    //short bvalue = 0;
    //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.0", out bvalue);
    //Console.WriteLine("CIO区0.0:" + bvalue);
    //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.3", out bvalue);
    //Console.WriteLine("CIO区0.3:" + bvalue);

    //Console.WriteLine("读取bool多个");
    //short bvalue1 = 0;
    //for (int i = 0; i < 6; i++)
    //{
    //    etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), out bvalue1);
    //    Console.WriteLine("CIO区0中的" + (i).ToString() + "=" + bvalue1);
    //}  

    Console.WriteLine("写入bool一个");
    etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.0", OmronFinsTCP.Net.BitState.OFF);
    etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.3", OmronFinsTCP.Net.BitState.ON); 
    Console.WriteLine("写入bool多个");
    for (int i = 0; i < 6; i++)
    {
        etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), OmronFinsTCP.Net.BitState.ON);
    }
    Console.WriteLine("ok");

    Console.ReadKey(); 
}

同样,他的通讯库不支持写入多个bool类型的数据,必须循环方式写入一个个的。查看PLC内存区,写入成功。

 

通讯报文

 

5、读取和写入D区的ushort类型数据

首先设置内存区D区100的4个数据,注意D区设置的数据类型为10进制无符号的整数,对应C#中就是ushort类型。

1、读取D区100开始的4个数据

程序代码

 static void Main(string[] args)
 {
     Console.WriteLine("Hello World!");
     //创建实例
     OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
     //连接plc,5000是超时时间
    var rt=  etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
     Console.WriteLine("连接成功!");

     //Console.WriteLine("读取bool一个");
     //short bvalue = 0;
     //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.0", out bvalue);
     //Console.WriteLine("CIO区0.0:" + bvalue);
     //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.3", out bvalue);
     //Console.WriteLine("CIO区0.3:" + bvalue);

     //Console.WriteLine("读取bool多个");
     //short bvalue1 = 0;
     //for (int i = 0; i < 6; i++)
     //{
     //    etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), out bvalue1);
     //    Console.WriteLine("CIO区0中的" + (i).ToString() + "=" + bvalue1);
     //}  

     //Console.WriteLine("写入bool一个");
     //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.0", OmronFinsTCP.Net.BitState.OFF);
     //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.3", OmronFinsTCP.Net.BitState.ON); 
     //Console.WriteLine("写入bool多个");
     //for (int i = 0; i < 6; i++)
     //{
     //    etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), OmronFinsTCP.Net.BitState.ON);
     //}
     //Console.WriteLine("ok");

     Console.WriteLine("读取ushort一个");
     short svalue = 0;
     etherNetPLC.ReadWord(OmronFinsTCP.Net.PlcMemory.DM, 100, out svalue);
     Console.WriteLine("d区100:" + svalue);

     Console.WriteLine("读取ushort多个");
     short[] shortarray = new short[] { };
     etherNetPLC.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 100, 4, out shortarray);
     for (int i = 0; i < shortarray.Length; i++)
     {
         Console.WriteLine("d区100中的" + (i).ToString() + "=" + shortarray[i]);
     }
     Console.WriteLine("ok");



     Console.ReadKey(); 
 }

可以看到,支持读取多个ushort类型的数据,通讯报文

 2、向D区200的地址写入4个ushort数据170, 171, 172, 173,174

程序代码

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");
    //创建实例
    OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
    //连接plc,5000是超时时间
   var rt=  etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
    Console.WriteLine("连接成功!");

    //Console.WriteLine("读取bool一个");
    //short bvalue = 0;
    //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.0", out bvalue);
    //Console.WriteLine("CIO区0.0:" + bvalue);
    //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.3", out bvalue);
    //Console.WriteLine("CIO区0.3:" + bvalue);

    //Console.WriteLine("读取bool多个");
    //short bvalue1 = 0;
    //for (int i = 0; i < 6; i++)
    //{
    //    etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), out bvalue1);
    //    Console.WriteLine("CIO区0中的" + (i).ToString() + "=" + bvalue1);
    //}  

    //Console.WriteLine("写入bool一个");
    //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.0", OmronFinsTCP.Net.BitState.OFF);
    //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.3", OmronFinsTCP.Net.BitState.ON); 
    //Console.WriteLine("写入bool多个");
    //for (int i = 0; i < 6; i++)
    //{
    //    etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), OmronFinsTCP.Net.BitState.ON);
    //}
    //Console.WriteLine("ok");

    //Console.WriteLine("读取ushort一个");
    //short svalue = 0;
    //etherNetPLC.ReadWord(OmronFinsTCP.Net.PlcMemory.DM, 100, out svalue);
    //Console.WriteLine("d区100:" + svalue);

    //Console.WriteLine("读取ushort多个");
    //short[] shortarray = new short[] { };
    //etherNetPLC.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 100, 4, out shortarray);
    //for (int i = 0; i < shortarray.Length; i++)
    //{
    //    Console.WriteLine("d区100中的" + (i).ToString() + "=" + shortarray[i]);
    //}
    //Console.WriteLine("ok"); 

    Console.WriteLine("写入ushort一个");
    var myresult = etherNetPLC.WriteWord(OmronFinsTCP.Net.PlcMemory.DM, 200, 148);
    Console.WriteLine("ok");
    Console.WriteLine("写入ushort多个");
    for (int i = 0; i < 5; i++)
    {
        etherNetPLC.WriteWord(OmronFinsTCP.Net.PlcMemory.DM, (short)(200 + i), (short)(170 + i));
    }
    Console.WriteLine("ok");


    Console.ReadKey(); 
}

写入成功

通讯报文

 

6、读取和写入H区的short类型数据

 设置H区的4个数据

很遗憾,通讯库不支持H区的读写

很遗憾,通讯库不支持H区的读写

 7、读取和写入W区的float类型数据

设置W区的5个数据

1、读取W区100开始的5个float数据 

程序代码

  static void Main(string[] args)
  {
      Console.WriteLine("Hello World!");
      //创建实例
      OmronFinsTCP.Net.EtherNetPLC etherNetPLC = new OmronFinsTCP.Net.EtherNetPLC();
      //连接plc,5000是超时时间
     var rt=  etherNetPLC.Link("192.168.1.4", 7788, (short)5000);
      Console.WriteLine("连接成功!");

      //Console.WriteLine("读取bool一个");
      //short bvalue = 0;
      //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.0", out bvalue);
      //Console.WriteLine("CIO区0.0:" + bvalue);
      //etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0.3", out bvalue);
      //Console.WriteLine("CIO区0.3:" + bvalue);

      //Console.WriteLine("读取bool多个");
      //short bvalue1 = 0;
      //for (int i = 0; i < 6; i++)
      //{
      //    etherNetPLC.GetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), out bvalue1);
      //    Console.WriteLine("CIO区0中的" + (i).ToString() + "=" + bvalue1);
      //}  

      //Console.WriteLine("写入bool一个");
      //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.0", OmronFinsTCP.Net.BitState.OFF);
      //etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "00.3", OmronFinsTCP.Net.BitState.ON); 
      //Console.WriteLine("写入bool多个");
      //for (int i = 0; i < 6; i++)
      //{
      //    etherNetPLC.SetBitState(OmronFinsTCP.Net.PlcMemory.CIO, "0." + i.ToString(), OmronFinsTCP.Net.BitState.ON);
      //}
      //Console.WriteLine("ok");

      //Console.WriteLine("读取ushort一个");
      //short svalue = 0;
      //etherNetPLC.ReadWord(OmronFinsTCP.Net.PlcMemory.DM, 100, out svalue);
      //Console.WriteLine("d区100:" + svalue);

      //Console.WriteLine("读取ushort多个");
      //short[] shortarray = new short[] { };
      //etherNetPLC.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 100, 4, out shortarray);
      //for (int i = 0; i < shortarray.Length; i++)
      //{
      //    Console.WriteLine("d区100中的" + (i).ToString() + "=" + shortarray[i]);
      //}
      //Console.WriteLine("ok"); 

      //Console.WriteLine("写入ushort一个");
      //var myresult = etherNetPLC.WriteWord(OmronFinsTCP.Net.PlcMemory.DM, 200, 148);
      //Console.WriteLine("ok");
      //Console.WriteLine("写入ushort多个");
      //for (int i = 0; i < 5; i++)
      //{
      //    etherNetPLC.WriteWord(OmronFinsTCP.Net.PlcMemory.DM, (short)(200 + i), (short)(170 + i));
      //}
      //Console.WriteLine("ok");

      //Console.WriteLine("读取short多个");
      //short[] shortarray = new short[] { };
      //etherNetPLC.ReadWords(OmronFinsTCP.Net.PlcMemory., 100, 4, out shortarray);
      //for (int i = 0; i < shortarray.Length; i++)
      //{
      //    Console.WriteLine("H区100中的" + (i).ToString() + "=" + shortarray[i]);
      //}
      //Console.WriteLine("ok");

      Console.WriteLine("读取float一个");
      float fvalue = 0.0f;
      etherNetPLC.ReadReal(OmronFinsTCP.Net.PlcMemory.WR, 100, out fvalue);
      Console.WriteLine("w区100:" + fvalue);

      Console.WriteLine("读取float多个"); 
      float fvalue2 = 0.0f;
      for (int i = 0; i < 5; i++)
      {
          etherNetPLC.ReadReal(OmronFinsTCP.Net.PlcMemory.WR, (short)(100 + i * 2), out fvalue2);
          Console.WriteLine("w区200中的" + (i).ToString() + "=" + fvalue2);
      }


      Console.ReadKey(); 
  }

通讯报文

 

2、向W区30的地址写入5个数据720, -730, -740,75.6f,-79.4f 

很遗憾,没有提供写入浮点数的方法

 

3、小结
 

下节,我们写自己的通讯库,非常强大,非常凶猛。

   FINS协议是一种基于TCP/IP网络通信的实时通信协议.能够实现欧姆龙工业设备之间的数据交换和控制指令传输。它采用了客户端/服务器模型,客户端发送请求,服务器返回响应,通过建立连接、传输数据包来实现设备之间的通信。
  FINS协议的核心是消息和指令的传输。消息格式包括消息头、命令和数据区。消息头定义了消息的类型、长度和地址等信息。命令部分包含了具体的指令内容,如读取数据、写入数据或执行其他操作。数据区则是存储实际的数据信息。


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python sanic框架钉钉和第三方打卡机实现

同样还是需要开通钉钉应用这里就不错多说了 第一步:梳理逻辑流程 前提&#xff1a;打卡的机器是使用postgres数据库&#xff0c;由于因为某些原因&#xff0c;钉钉userId 我已经提前获取到了存放到数据库里。 1.用户打卡成功后&#xff0c;我们应该监听数据库进行查询&#xf…

西北大学844计算机类考研-25级初试高分总攻略

西北大学844计算机类考研-25级初试高分攻略 个人介绍 ​ 本人是西北大学22级软件工程研究生&#xff0c;考研专业课129分&#xff0c;过去一年里在各大辅导机构任职&#xff0c;辅导考研学生专业课844&#xff0c;辅导总时长达400小时&#xff0c;辅导学生超过20余人&#xf…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Row组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之线性布局容器Row组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Row组件 沿水平方向布局容器。 子组件 可以包含子组件。 接口 Row(…

【SVN】Windows版合并提交bat文件+自定义菜单快捷键

【工具向】利用bat批处理打开TortoiseGit简化版本管理流程_tortoisegit bat-CSDN博客 start cmd /k "cd C:\YourBranchProj && svn cleanup && svn update && svn merge C:\YourTrunkProj -r 历史版本号:HEAD && svn commit -m "me…

pyCharm 打印控制台中文乱码解决办法

解决方法 在 "File" -> "Settings" 中的控制台设置&#xff1a; 在 "File" -> "Settings" 中&#xff0c;你可以找到 "Editor" -> "General" -> "Console"。在这里&#xff0c;你可能会找到…

数据结构:栈

1.栈的定义 栈是仅限在表尾进行插入和删除的线性表&#xff0c;栈又被称为后进先出的线性表 1.1栈顶和栈底 栈是一个线性表&#xff0c;我们允许插入和删除的一端称为栈顶 栈底和栈顶相对&#xff0c;实际上栈底的元素不需要关心 1.2入栈和出栈 栈元素的插入操作叫做入栈&…

“2023年的技术发展与个人成长:回顾与展望“

文章目录 每日一句正能量前言工作生活未来展望后记 每日一句正能量 凡事顺其自然&#xff0c;遇事处于泰然&#xff0c;得意之时淡然&#xff0c;失意之时坦然&#xff0c;艰辛曲折必然&#xff0c;历尽沧桑悟然。 前言 在这快速发展的信息时代&#xff0c;技术的进步和创新不…

vue2中使用百度地图BMapGL

1、npm 命令安装 npm install vue-bmap-gl --save2、main.js 中文件引入 import VueBMap from vue-bmap-gl import vue-bmap-gl/dist/style.css VueBMap.initBMapApiLoader({// 百度的keyak:*********,// 这个密钥请使用自己注册的 }) Vue.use(VueBMap)3、页面调用 <temp…

Python 中的数学运算(Python Math)

Python中的math模块是数学运算的重要工具&#xff0c;提供了丰富的数学函数和常数。本文将深入探讨math模块的功能和用法&#xff0c;使您能够更好地利用Python进行数学运算。 Python的math模块是一个强大的工具集&#xff0c;涵盖了许多基本的数学函数和常数&#xff0c;适用…

C++11 lambda函数和包装器

目录 前言 一.lambda的引入 二、lambda函数的使用 1.一般使用 2.引用 三、包装器 1.包装普通对象 2.包装类成员对象 3.bind 前言 学习过python的同学应该对lambda函数不陌生&#xff0c;这是一个匿名函数&#xff0c;不需要写函数的名字。在不会多地方调用某个简单函数…

kubeadm来搭建k8s集群。

我们采用了二进制包搭建出的k8s集群&#xff0c;本次我们采用更为简单的kubeadm的方式来搭建k8s集群。 二进制的搭建更适合50台主机以上的大集群&#xff0c;kubeadm更适合中小型企业的集群搭建 主机配置建议&#xff1a;2c 4G 主机节点 IP …

ElementUI的Table组件行合并上手指南

ElementUI的Table组件行合并 &#xff0c;示例用官网vue3版的文档 <el-table :data"tableData" :span-method"objectSpanMethod" border style"width: 100%; margin-top: 20px"><el-table-column prop"id" label"ID&qu…

全面解析 I2C 通信协议

全面解析 I2C 通信协议 lvy 嵌入式学习规划 2023-12-22 21:20 发表于陕西 嵌入式学习规划 嵌入式软件、C语言、ARM、Linux、内核、驱动、操作系统 80篇原创内容 公众号 点击左上方蓝色“嵌入式学习规划”&#xff0c;选择“设为星标” 1、什么是I2C协议 I2C 协议是一个允许…

postman使用-03发送请求

文章目录 请求1.新建请求2.选择请求方式3.填写请求URL4.填写请求参数get请求参数在params中填写&#xff08;填完后在url中会自动显示&#xff09;post请求参数在body中填写&#xff0c;根据接口文档请求头里面的content-type选择body中的数据类型post请求参数为json-选择raw-选…

高压放大器的使用方法是什么

高压放大器是一种重要的电子设备&#xff0c;其主要功能是放大输入信号的电压&#xff0c;并输出更高电压的信号。它在各种工业、实验室和研究领域都有着广泛的应用。下面安泰电子官网将详细介绍高压放大器的使用方法以及相关注意事项。 高压放大器是一种专门用于将低电压信号转…

Unity is running with Administrator privileges, which is not supported

Unity is running with Administrator privileges, which is not supported 如果还是弹出CMD窗口提示输入密码&#xff0c;但无法怎样都无法输入&#xff0c;请关闭窗口&#xff0c;然后右键快捷方式管理员运行一次。 ----------分割线---------- 为什么这样做&#xff1f; 很…

模型量化 | Pytorch的模型量化基础

官方网站&#xff1a;Quantization — PyTorch 2.1 documentation Practical Quantization in PyTorch | PyTorch 量化简介 量化是指执行计算和存储的技术 位宽低于浮点精度的张量。量化模型 在张量上执行部分或全部操作&#xff0c;精度降低&#xff0c;而不是 全精度&#xf…

多线程编程(二)信号量

上边的函数是获取资源&#xff0c;下边的函数是释放资源。信号量就是当有多个线程争夺共享资源的时候信号量相当于管控的&#xff0c;57个人去50个位置的餐厅吃饭&#xff0c;信号量是管理开关门的呢个。 QSemaphore freesapce(buffersize);//缓冲区大小。 QSemaphore usedsp…

Oracle数据updater如何回滚

1.查询update语句执行的时间节点 &#xff1b; select t.FIRST_LOAD_TIME, t.SQL_TEXT from v$sqlarea t where to_char(t.FIRST_LOAD_TIME) > 2023-03-19/17:00:00 order by t.FIRST_LOAD_TIME desc;开启表的行迁移 alter table test enable row movement;3.回滚表数据到…

uni-app/vue封装etc车牌照输入,获取键盘按键键值

先看下效果如下&#xff1a; 动态图如下 uniapp的keyup获取不到keyCode和compositionstart&#xff0c;compositionend&#xff0c;所以需要监听input节点的keyup事件&#xff0c; 思路以及代码如下&#xff1a; 1.将每一个字符用文本框输入&#xff0c;代码如下 <view …