Oki's Blog https://okoki.cn/ zh-CN 越努力,越幸运 Fri, 29 Mar 2024 09:03:38 +0800 Fri, 29 Mar 2024 09:03:38 +0800 【分享】S7-200 Smart开源标准化编程MODBUS RTU程序 https://okoki.cn/Technology/105.html https://okoki.cn/Technology/105.html Fri, 29 Mar 2024 09:03:38 +0800 Mr.oki 完整的介绍程序的功能:
1、不需要编程,只需在数据块里正确填好各项参数,即可完美工作。
2、通信任务分为轮询任务组,和写优先任务组。轮询任务组内可以放置写操作任务。即写操作在正常轮流工作里。
3、掉站跳过和定时掉站恢复功能。
4、定时写优先组内操作的数据读回功能,即把写操作变成读操作把写入从站的数据读回到PLC。
5、轮询任务组里的任意通信任务可以临时退出和随时加入轮询功能里。如果想要人工的将某个轮询内的通信任务退出轮询,将其读写操作的0和1改变为0、1、10、11、以外的任意数值,这条通信任务就退出轮询了。

新增功能
6、以上2~4功能可以通过设置来启用和停用。

假如应用中会出现同一时刻(同一扫描周期)的多个写操作,那么请把高优先级的写任务写在小序号(其实没序号)的写操作任务里。因为写操作的检查是从小序号开始的,其实是按顺序检查,先检查到的先执行。
数据块里的指针赋值是一大麻烦,要么是很大的双整数,要么是十六进制数,很不方便。这次这里的改进就是输入简单的双整数,比始填4700是希望指向VB4700的指针,封装的子程序在第一个扫描周期会将4700这些双整数变成指针。当然,此数据块中输入十六进制数和很大的双整数值的指针数值也可以,是兼容的。

切记设置好库内存,背影数据等的地址,不要出现干涉。干涉或数据块填写的不正确,程序就工作不起来了。

程序下载链接:https://pan.shenwb.com/s/Qlie
[自豪的使用 okoki 个人云盘,请放心下载]

]]>
0 https://okoki.cn/Technology/105.html#comments https://okoki.cn/feed/
【分享】S7-200 SMART官方样例程序合集 https://okoki.cn/Technology/103.html https://okoki.cn/Technology/103.html Sun, 17 Mar 2024 14:16:59 +0800 Mr.oki 在官网搬运了一些样例程序,把它们的链接整理到了word中,在文件中按住Ctrl点击链接蓝色文字即可打开或者下载对应的文件,故上传在此,以方便使用SMART的人。

https://pan.shenwb.com/s/vLHx
[自豪的使用okoki个人云盘,请放心下载]

]]>
2 https://okoki.cn/Technology/103.html#comments https://okoki.cn/feed/
【时间同步】Logix5000 Clock Update Tool https://okoki.cn/Technology/100.html https://okoki.cn/Technology/100.html Sun, 17 Mar 2024 14:07:24 +0800 Mr.oki 使用Logix5000 Clock Update Tool 可以实现AB PLC与PC的时间同步。
640.png

]]>
0 https://okoki.cn/Technology/100.html#comments https://okoki.cn/feed/
【活动】留言送虚拟空间 https://okoki.cn/default/91.html https://okoki.cn/default/91.html Mon, 06 Nov 2023 14:08:16 +0800 Mr.oki 探险家们:
感谢大家对okoki.cn的支持~
为了回馈各位探险家的支持,即日起在博客内留言即有机会获得虚拟空间哦
奖品名称:虚拟空间
数量:2个
使用时间:2年
抽奖方式:评论时间到期后,整理名单公示,并随机抽取中奖探险家2名
活动时间:2023年11月7日0:00~12月30日23:50

获得虚拟空间的探险家请在footer放上本站链接,谢谢。

]]>
6 https://okoki.cn/default/91.html#comments https://okoki.cn/feed/
【PLC通讯】C#通过串口与FX3U通讯 https://okoki.cn/Technology/89.html https://okoki.cn/Technology/89.html Thu, 26 Oct 2023 09:52:00 +0800 Mr.oki winform画面

1.png

源代码

 namespace C_通过串口与FX3U通讯
{
    public partial class formMain : Form
    {
        public formMain()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
        }

        ActFXCPU fxCPU = new ActFXCPU();
        /// <summary>
        /// 打开通讯连接
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Conn_Click(object sender, EventArgs e)
        {
            string cpu;
            int type;
            int n;
            if (cb_Port.Text.Length > 0)
            {
                string port = cb_Port.Text;
                char sp = 'M';
                string[] spm = new string[4];
                spm = port.Split(sp);

                fxCPU.Close();
                fxCPU.ActPortNumber = Convert.ToInt16(spm[1]);
                fxCPU.ActBaudRate = Convert.ToInt16(cb_BaudRate.Text);

                n = fxCPU.Open();
                if (n == 0)
                {
                    lb_connStsTxt.Text = "通讯成功!";
                    lb_connStsTxt.ForeColor = Color.Green;

                    fxCPU.GetCpuType(out cpu, out type);
                    lb_PLCStyleTxt.Text = cpu;
                }
                else
                {
                    lb_connStsTxt.Text = "通讯失败!";
                    lb_connStsTxt.ForeColor = Color.Red;
                }

            }
        }
        /// <summary>
        /// 读取1次X点事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_XReadOnce_Click(object sender, EventArgs e)
        {
            // readInput();
        }

        private void readInput()
        {
            while (true)
            {
                int[] arrX = new int[10];
                int iRetX = fxCPU.ReadDeviceRandom("X0\nX1\nX2\nX3\nX4\nX5\nX6\nX7", 8, out arrX[0]);

                //创建存放lable标签的集合
                List<Control> lableListX = new List<Control>();
                //检索出所有符合名称的标签控件
                for (int j = 0; j < 10; j++)
                {
                    //返回值为集合
                    Control[] conLable = this.Controls.Find("lb_X" + j.ToString(), true);
                    if (conLable.Count() >= 1)
                    {
                        //判断控件是否是标签
                        if (conLable[0] is Label)
                        {
                            lableListX.Add(conLable[0]);
                        }
                    }
                }
                for (int i = 0; i < lableListX.Count; i++)
                {
                    Label lab = lableListX[i] as Label;
                    lab.BackColor = arrX[i] == 1 ? Color.Green : Color.Red;
                }

                int[] arrY = new int[10];
                int iRetY = fxCPU.ReadDeviceRandom("Y0\nY1\nY2\nY3\nY4\nY5", 6, out arrY[0]);

                List<Control> lableListY = new List<Control>();

                for (int j = 0; j < 10; j++)
                {
                    Control[] conLable = this.Controls.Find("lb_Y" + j.ToString(), true);
                    if (conLable.Count() >= 1)
                    {
                        if (conLable[0] is Label)
                        {
                            lableListY.Add(conLable[0]);
                        }
                    }
                }
                for (int i = 0; i < lableListY.Count; i++)
                {
                    Label lab = lableListY[i] as Label;
                    lab.BackColor = arrY[i] == 1 ? Color.Green : Color.Red;
                }

                //读取M点状态
                int getM0;
                int iRetM = fxCPU.GetDevice("M60",out getM0);
                if (getM0 == 1)
                {
                    btn_M60.Text = "M60_ON";
                    btn_M60.BackColor = Color.Green;
                }
                else
                {
                    btn_M60.Text = "M60_OFF";
                    btn_M60.BackColor = Color.Red;
                }
                //读取测试脉冲
                int[] arrD0 = new int[2];
                int iRetD0 = fxCPU.ReadDeviceRandom("D0", 1,out arrD0[0]);
                textBox1.Text = arrD0[0].ToString();
            }

        }

        /// <summary>
        /// 连续读取X点事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_XReadCon_Click(object sender, EventArgs e)
        {
            //创建一个连续读取委托
            ThreadStart myInputReadConn = new ThreadStart(readInput);
            //创建一个后台线程
            Thread myThread = new Thread(myInputReadConn);
            myThread.IsBackground = true;
            myThread.Start();
        }

        private void btn_M60_Click(object sender, EventArgs e)
        {
            int S;
            if (btn_M60.Text=="M60_OFF")
            {
                S = fxCPU.SetDevice("M60", 1);
               
            }
            else
            {
                S = fxCPU.SetDevice("M60", 0);
            }
        }
    }

}

]]>
2 https://okoki.cn/Technology/89.html#comments https://okoki.cn/feed/
【PLC通讯】S7-1200PLC与KepServer6.4通讯 https://okoki.cn/Technology/59.html https://okoki.cn/Technology/59.html Wed, 25 Oct 2023 09:46:41 +0800 Mr.oki 测试环境:Win10专业版、KepServer6.4、博图V16、DCDCDC1214

1-PLC侧设置

PLC IP:192.168.2.10
PLC属性:连接机制勾选允许来自远程对象的PUT/GET通讯访问
1.png
DB块属性:取消勾选优化块的访问
2.png
编写以下PLC程序用作与KepServer通讯时数据监控测试
3.png

2-配置KepServer6.4

2.1-添加通道

连接性-->右键-->新建通道-->Siemens TCP/IP Ethernet。下一步
4.png
输入通道名称S7_1200。下一步
5.png
选择网络适配器(IP 应与PLC IP在同一网段),确定。下一步
6.png
下一步
7.png
下一步
8.png
完成
9.png

2.2-添加设备

点击添加设备-->输入设备名称S7_1200。下一步
10.png
型号选择S7-1200,即1200PLC。下一步
11.png
输入PLC IP:192.168.2.10。下一步
12.png
下一步
13.png
下一步
14.png
下一步
15.png
下一步
16.png
下一步
17.png
下一步
18.png
下一步
19.png
下一步
20.png
完成
21.png

3-添加变量

I类型变量--I0.3
数据属性直接写变量名称就可以
22.png
Q类型变量--Q0.1
23.png
M类型变量--M2.1
24.png
M类型变量--MW10
26.png
DB块类型变量
27.png
L1 Bool型,偏移量2。地址:DB1.X2.0
28.png
D1 INT型,偏移量0。地址:DB1.INT0
30.png

4-效果演示

31.png

]]>
0 https://okoki.cn/Technology/59.html#comments https://okoki.cn/feed/
上位机与MES数据交互的常用方案 https://okoki.cn/automation/58.html https://okoki.cn/automation/58.html Tue, 26 Sep 2023 09:57:50 +0800 Mr.oki 前言

大家好,我是付工。
在实际应用过程中,经常有学员问道:上位机怎么与MES进行信息交互?
今天跟大家介绍一下,上位机与MES对接的几种常用的方式。

数据库交互

数据库是任何一个开发人员都必须掌握的技能,因此,对于一些简单的交互,通过数据库应该是双方都能够接受的,这里要注意,尽量避免操作生产数据表,可以根据实际业务场景,通过新增一个专门用于交互的数据表,来减少操作失误。

文件交互

有的时候,上位机也可以通过文件来与MES交互,可以是各种格式的文件,文本文件、excel、xml都可以。比如,上位机或MES定时生成文本文件,对方检测文件的生成时间,来判断是否流程完成,进而实现后续流程。

TCP通信交互

这里的TCP指的是传输层TCP,双方约定好协议内容,通过Socket连接,发送和接收,来实现数据通信。

通信协议交互

应用层TCP包括一些确定的应用层协议,比如ModbusTCP、MQTT、OPCUA等。

KepServer

有一些厂家的开发人员,为了方便,会使用KepServer来做数据交互,KepServer本身不仅可以走OPC,还支持数据库或Iot Gateway插件等一些方式。

WebService

WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言(通过 xml 描述)间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。

WebApi

WebApi是一个简单的构建HTTP服务的新框架。在.Net平台上WebApi是一个开源的、理想的、构建REST-ful服务的技术,可以部署在应用程序和IIS上。
当然,我们也可以通过Http协议来实现对接,毕竟WebApi的本质也是Http协议。

WCF

WCF也是基于SOAP的,数据格式是XML,WCF是Web Service(ASMX)的进化版,可以支持各种各样的协议,像TCP,HTTP,HTTPS,Named Pipes, MSMQ。但是WCF的主要问题是,它配置起来特别的繁琐,所以WCF使用越来越少了。

本文为非原创文章,不适用原创声明。转载于新阁教育付工 dotNet工控上位机。
]]>
0 https://okoki.cn/automation/58.html#comments https://okoki.cn/feed/
阔别三年的工博会 https://okoki.cn/photo/55.html https://okoki.cn/photo/55.html Thu, 21 Sep 2023 19:16:00 +0800 Mr.oki IMG_5043.jpeg

]]>
0 https://okoki.cn/photo/55.html#comments https://okoki.cn/feed/
【PLC通讯】AB PLC的modbus TCP 通讯 https://okoki.cn/Technology/54.html https://okoki.cn/Technology/54.html Sun, 17 Sep 2023 16:19:00 +0800 Mr.oki 硬件设备:AB PLC 1769-L18ERM 作为 modbus TCP 客户端

模拟软件:Modbus Slave仿真软件 作为modbus TCP 服务器

在AB官网下载 modbus TCP AOI文件包,检索modbus TCP 关键词即可找到。文件包中附带说明书 ,说明书介绍的很详细,按照说明书一步一步的设置即可,在这里不再赘述。
1.png
22.png
2.png
3.png
5.png
打开Modbus Slave 对应设置,地址设置为1,地址要与服务器里面地址对应。这里测试设置前100个数据 PLC对其进行 读操作,后100个数据 PLC对其 进行写操作。
6.png
地址和端口的设置,同样要和服务器对应。
7.png
运行使能后,检查AOI功能块连接状态,sts-connected 显示绿色说明已经通讯连接正常。
8.png
测试发送和接收数据,经测试通讯正常,可以进行正常的读写数据。
9.png
该通讯方式适合modbus RTU 仪表类设备通过中间模块转换成 modbus TCP 通讯进而达到与AB PLC进行数据交互。
同样的道理硬件设备更换成支持modbus TCP 的其它品牌PLC如三菱FX5U PLC 也可以进行以上的通讯。

感谢Teckie供稿

]]>
0 https://okoki.cn/Technology/54.html#comments https://okoki.cn/feed/
Typecho中emoji表情不显示 https://okoki.cn/default/43.html https://okoki.cn/default/43.html Thu, 14 Sep 2023 16:45:00 +0800 Mr.oki Typecho 默认不支持 Emoji 表情,由于编码的问题而造成,我们只需简单两步即可让 typecho 支持 emoji 表情评论,只要将默认的数据库编码 utf8 修改为 utf8mb4 即可。

更改过程

1.修改评论内容字段的编码

使用数据库管理工具,找到 typecho_comments 评论表的 text 字段,将该字段的编码由 utf8_general_ci 改为 utf8mb4_general_ci 。

2.修改数据库配置文件

打开网站根目录数据库配置文件 config.inc.php ,将 charset 的值由 utf8 改为 utf8mb4 。

$db = new Typecho_Db('Pdo_Mysql', 'typecho_');
$db->addServer(array (
  'host' => '',
  'user' => '',
  'password' => '',
  'charset' => 'utf8mb4',
  'port' => '',
  'database' => '',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

成功显示了,真不错。

然后发现在文章中带emoji表情会显示成?,毋容置疑,肯定也是编码问题,干脆直接把几个表的编码全改成utf8mb4得了。

alter table typecho_comments convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_contents convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_fields convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_metas convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_options convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_users convert to character set utf8mb4 collate utf8mb4_unicode_ci;
]]>
0 https://okoki.cn/default/43.html#comments https://okoki.cn/feed/