C#类与类库调用注意事项

news2025/1/18 10:00:19


创建一个类文件,myfunction.cs

//静态类:直接引用、无需实例化
static public int jiafa(int V)
//普通类:引用时需要实例化
public int jiafa(int V)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace OPC_Client
{
    **class myfunction**
    {
        //静态类:直接引用、无需实例化
        //static public int jiafa(int V)
        //普通类:引用时需要实例化
        public int jiafa(int V)
        {
            int M = 2;
            int W = V + M;
            return W;
        }
        //普通类:引用时需要实例化
        public int chengfa(int V)
        {
            int M = 2;
            int W = V * M;
            return W;
        }
        //普通类:引用时需要实例化
        public int jianfa(int V)
        {
            int M = 2;
            int W = V - M;
            return W;
        }
        //普通类:引用时需要实例化
        public int chufa(int V)
        {
            int M = 2;
            int W = V / M;
            return W;
        }
        public static bool IsRuning(string exeName)
        {
            bool res = false;
            //if (Process.GetProcessesByName(exeName).Length > 0)
            if (Process.GetProcessesByName(exeName).ToList().Count > 0)
            {
                res = true;
            }
            return res;
        }

        public static float fValue = 10;


        public static decimal dValue = 10;
        public static int xiancheng1 = 10;
        public static int xiancheng2 = 10;
        public static int xiancheng3 = 10;
    }
}

另一个类HBIS.cs中调用类myfunction.cs

myfunction szys = new myfunction();//实例化
using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OPCAutomation;
using System.Diagnostics;
using System.Threading;
using System.IO;//Thread.Sleep(5000);


namespace OPC_Client
{

    public partial class HBIS : Form
    {
        OPCServer objServer;
        OPCGroups objGroups;
        OPCGroup objGroup;
        OPCItems objItems;
        Array strItemIDs;
        Array lClientHandles;
        Array lserverhandles;
        Array lErrors;
        //int ltransID_Rd = 1;
        //int lCancelID_Rd;
        object RequestedDataTypes = null;
        object AccessPaths = null;
        //Array lerrors_Rd;
        Array lErrors_Wt;
        static int r_items = 13;
        static int w_items = 7;

        int lTransID_Wt;
        int lCancelID_Wt;
        public HBIS()
        {
            InitializeComponent();
        }

        bool isrun = false;//
        //连接opc server
        private void button1_Click(object sender, EventArgs e)
        {
            //(1)创建opc server对象
            objServer = new OPCServer();
            //连接opc server
            objServer.Connect("KingView.View.1", null);//KEPware.KEPServerEx.V4
            //(2)建立一个opc组集合
            objGroups = objServer.OPCGroups;
            //(3)建立一个opc组
            objGroup = objGroups.Add(null); //Group组名字可有可无
            //(4)添加opc标签
            objGroup.IsActive = true; //设置该组为活动状态,连接PLC时,设置为非活动状态也一样
            objGroup.IsSubscribed = true; //设置异步通知
            objGroup.UpdateRate = 250;
            objServer.OPCGroups.DefaultGroupDeadband = 0;
            objGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
            //objGroup.AsyncReadComplete += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(AsyncReadComplete);
            //objGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(AsyncWriteComplete);
            objItems = objGroup.OPCItems; //建立opc标签集合
            string[] IntmpIDs = new string[r_items];
            int[] tmpCHandles = new int[r_items];
            for (int i = 1; i < r_items; i++)
            {
                tmpCHandles[i] = i;
            }

            //组态王读和写变量数据共计12个
            for (int i = 1; i < r_items; i++)
            {
                IntmpIDs[i] = "Tag_" + i + ".Value";
            }

            strItemIDs = (Array)IntmpIDs;//必须转成Array型,否则不能调用AddItems方法
            lClientHandles = (Array)tmpCHandles;
            // 添加opc标签
            objItems.AddItems(r_items - 1, ref strItemIDs, ref lClientHandles, out lserverhandles, out lErrors, RequestedDataTypes, AccessPaths);
        }


        //结束并断开opc server
        private void button4_Click(object sender, EventArgs e)
        {
            objServer.Disconnect();
            //关闭kepserver进程,这个跟OPC操作无关
            /*
            foreach ( Process oneProcess in Process.GetProcesses())
            {
            if (oneProcess.ProcessName == "ServerMain")
            oneProcess.Kill();
            }
            */
        }
        
        //每当项数据有变化时执行的事件,采用订阅方式
        myfunction szys = new myfunction();
        void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
        {          
            //数据交换【读取组态王共计6个变量数据】
            //组态王——>label、label——>textBox
            for (int i = 0; i < NumItems; i++)
            {
                int cHandles = Convert.ToInt32(ClientHandles.GetValue(i + 1));

                switch (cHandles)
                {
                    case 1: 
                        this.Data1.Text = ItemValues.GetValue(i + 1).ToString();
                        this.textBox1.Text = szys.jiafa(Convert.ToInt32(this.Data1.Text)).ToString();
                        break;
                    case 2:
                        this.Data2.Text = ItemValues.GetValue(i + 1).ToString();
                        this.textBox2.Text = szys.chengfa(Convert.ToInt32(this.Data2.Text)).ToString();
                        break;
                    case 3:
                        this.Data3.Text = ItemValues.GetValue(i + 1).ToString();
                        this.textBox3.Text = szys.jianfa(Convert.ToInt32(this.Data3.Text)).ToString();
                        break;
                    case 4:
                        this.Data4.Text = ItemValues.GetValue(i + 1).ToString();
                        this.textBox4.Text = szys.chufa(Convert.ToInt32(this.Data4.Text)).ToString();
                        break;
                    case 5:
                        this.Data5.Text = ItemValues.GetValue(i + 1).ToString();
                        this.textBox5.Text = szys.chengfa(Convert.ToInt32(this.Data5.Text)).ToString();
                        break;
                    case 6:
                        this.Data6.Text = ItemValues.GetValue(i + 1).ToString();
                        this.textBox6.Text = szys.jianfa(Convert.ToInt32(this.Data6.Text)).ToString();
                        break;
                    default:
                        ;
                        break;
                }

                //myfunction.fValue = 100;

            }
        }

        //发送异步写数据指令
        //textBox——>组态王
        private void button3_Click(object sender, EventArgs e)
        {
            Array AsyncValue_Wt;
            Array SerHandles;
            object[] tmpWtData = new object[w_items];//写入的数据必须是object型的,否则会报错  3-->7
            int[] tmpSerHdles = new int[w_items]; //3-->7
            //将输入数据赋给数组,然后再转成Array型送给AsyncValue_Wt           

            tmpWtData[1] = this.textBox1.Text;
            tmpWtData[2] = this.textBox2.Text;
            tmpWtData[3] = this.textBox3.Text;
            tmpWtData[4] = this.textBox4.Text;
            tmpWtData[5] = this.textBox5.Text;
            tmpWtData[6] = this.textBox6.Text;
            
            AsyncValue_Wt = (Array)tmpWtData;

            //将输入数据送给的Item对应服务器句柄赋给数组,然后再转成Array型送给SerHandles
            //组态王写变量数据共计6个
            tmpSerHdles[1] = Convert.ToInt32(lserverhandles.GetValue(7));
            tmpSerHdles[2] = Convert.ToInt32(lserverhandles.GetValue(8));
            tmpSerHdles[3] = Convert.ToInt32(lserverhandles.GetValue(9));
            tmpSerHdles[4] = Convert.ToInt32(lserverhandles.GetValue(10));
            tmpSerHdles[5] = Convert.ToInt32(lserverhandles.GetValue(11));
            tmpSerHdles[6] = Convert.ToInt32(lserverhandles.GetValue(12));

            lTransID_Wt = w_items - 1;
            SerHandles = (Array)tmpSerHdles;
            objGroup.AsyncWrite(w_items - 1, ref SerHandles, ref AsyncValue_Wt, out lErrors_Wt, lTransID_Wt, out lCancelID_Wt);//2-->6 
        }

        //异步写入成功
        //private void AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors)
        //{
        //    //MessageBox.Show("数据写入成功!");
        //}

        private void button2_Click(object sender, EventArgs e)
        {
            //本质:分配新的内存空间来显示新的窗体
            //方法一:
            //Form fm2 = new stati();//实例化窗体2对象
            //fm2.Show();//调用窗体2对象的显示方法
            //方法二
            //new stati().Show();//直接实例化,并调用实例对象的窗体显示功能
            
            //登录验证
            if (textBox7.Text == "123456")
            {
                //MessageBox.Show("登录成功");
                //new stati().Show();
                //隐藏当前窗体(this)
                //this.Hide();//方法一
                //Hide();//方法二

                //采用委托新线程的方法实现第二个窗体(stati)的跳转
                //Thread t1 = new Thread(delegate() { new stati().ShowDialog(); });
                //t1.Start();
                //Dispose();//方法一
                //Close();//方法二

                //标记法
                //1、程序启动类中自定义一个标记
                //2、判断标记为"验证成功"后才显示第二个窗体
                //3、监控何时关闭第一个窗体(HBIS),当关闭第一个窗体前,应先将标记变为"验证成功"
                Program.success_flag = "验证成功";
                Close();

            }else {
                MessageBox.Show("登录失败");
            }                        
        }

        private void button5_Click(object sender, EventArgs e)
        {
            //登录验证
            if (textBox7.Text == "123456")
            {
                //采用委托delegate新线程的方法实现第二个窗体(stati)的跳转
                Thread t2 = new Thread(delegate() { new ftplt().ShowDialog(); });
                t2.Start();
                Dispose();         
            }
            else
            {
                MessageBox.Show("登录失败");
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            //登录验证
            if (textBox7.Text == "123456")
            {
                //采用委托delegate新线程的方法实现第二个窗体(stati)的跳转
                Thread t3 = new Thread(delegate() { new mForm().ShowDialog(); });
                t3.Start();
                Dispose();         
            }
            else
            {
                MessageBox.Show("登录失败");
            }
        }
    }
}

类库
新建类库 Algorithm,类math2必须用public修饰

区分myfunction与math2的区别

class myfunction//类 
public class math2//类库,带public,否则另一类库无法访问
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Algorithm
{
    **public class math2//类库,带public,否则另一类库无法访问**
    {


        //静态类:直接引用、无需实例化
        //static public int jiafa(int V)
        //普通类:引用时需要实例化
        public int jiafa2(int V)
        {
            int M = 2;
            int W = V + M;
            return W;
        }
        //普通类:引用时需要实例化
        public int chengfa2(int V)
        {
            int M = 2;
            int W = V * M;
            return W;
        }
        //普通类:引用时需要实例化
        public int jianfa2(int V)
        {
            int M = 2;
            int W = V - M;
            return W;
        }
        //普通类:引用时需要实例化
        public int chufa2(int V)
        {
            int M = 2;
            int W = V / M;
            return W;
        }



        

        public static float fValue = 10;


        public static decimal dValue2 = 10;
        public static int xiancheng12 = 10;
        public static int xiancheng22 = 10;
        public static int xiancheng32 = 10;
    }
}

在主类库OPC_Client中添加引用类库Algorithm
在这里插入图片描述
然后在调用类库Algorithm的类文件中Using Algorithm

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
**using Algorithm;**
namespace OPC_Client
{
    //class class_var
    //{
    //    public static int Numglobal1;
        
    //}

    public partial class ftplt : Form
    {
        public ftplt()
        {
            InitializeComponent();
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start("https://mp.csdn.net");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            
            if (tabControl1.TabPages[btn.Text]==null)
            {
                tabControl1.TabPages.Add(btn.Text, btn.Text);
                if (btn.Text == "一号锅炉") 
                {
                    Form frm = new boiler1();
                    frm.TopLevel = false;
                    frm.Dock = DockStyle.Fill;
                    frm.FormBorderStyle = FormBorderStyle.None;
                    frm.Show();
                    tabControl1.TabPages[btn.Text].Controls.Add(frm);
                }
                else if (btn.Text == "二号锅炉")
                {
                    Form frm = new boiler2();
                    frm.TopLevel = false;
                    frm.Dock = DockStyle.Fill;
                    frm.FormBorderStyle = FormBorderStyle.None;
                    frm.Show();
                    tabControl1.TabPages[btn.Text].Controls.Add(frm);
                }
                //else if()
                //{}

            }
            tabControl1.SelectedTab = tabControl1.TabPages[btn.Text];
        }
        
        private void timer1_Tick(object sender, EventArgs e)
        {
            //if (myfunction.xiancheng1 < 60)
            //    myfunction.xiancheng1++;
            //else
            //    myfunction.xiancheng1 = 0;
            //lblglobal1.Text = myfunction.xiancheng1.ToString();


            if (math2.xiancheng12 < 60)
                math2.xiancheng12++;
            else
                math2.xiancheng12 = 0;
            lblglobal1.Text = math2.xiancheng12.ToString();
        }

    }
}

代码和上位机实时读写PLC架构流程:https://download.csdn.net/download/weixin_37928884/88317574

上位机编程参考资料

C#多线程开发-线程间通讯
https://blog.csdn.net/zls365365/article/details/122678135

c#与S7.net通讯实际工程应用
https://blog.csdn.net/flowsea123/article/details/129464477

C#三种定时器Timer详解
https://blog.csdn.net/qq_57798018/article/details/128243618

C# winform textbox PLC寄存器读写功能实现
https://blog.csdn.net/wint_1996/article/details/130596525

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

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

相关文章

VS Code 配置 JAVA(总)

VS Code 配置 JAVA&#xff08;总&#xff09; 主要参考&#xff1a; 处理单独 java 源文件的vscode配置VScode关于 java 配置的总体说明安装多版本 jdk 后&#xff0c;如何指定使用某个版本&#xff1f;某些与java相关的有用扩展VS code 如何配置不同编程语言及其工作流程 …

运维必备 | 使用 ansible 自动化批量执行工具,提升企业运维工作效率

各位亲爱的读者&#xff0c;现在公众号更改了推送规则&#xff0c;如果您需要第一时间看到我们推送的好内容。 一定要记得给公众号星标&#xff0c;经常点赞、在看、转发、分享和留下您的评论 &#xff01; 关注回复【学习交流群】加入【安全开发运维】答疑交流群 请朋友们【多…

买卖股票的最佳时机含冷冻期

题目链接 买卖股票的最佳时机含冷冻期 题目描述 注意点 卖出股票后&#xff0c;无法在第二天买入股票 (即冷冻期为 1 天)不能同时参与多笔交易&#xff08;必须在再次购买前出售掉之前的股票&#xff09;可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09…

l8-d11 TCP连接管理与UDP协议

一、三次握手 TCP 建立连接的过程叫做握手。 采用三报文握手&#xff1a;在客户和服务器之间交换三个 TCP 报文段&#xff0c;以防止已失效的连接请求报文段突然又传送到了&#xff0c;因而产生 TCP 连接建立错误。 二、四次挥手 TCP 连接释放过程比较复杂。 数据传输结束后…

2、k-means聚类算法sklearn与手动实现

本文将对k-means聚类算法原理和实现过程进行简述 算法原理 k-means算法原理较简单&#xff0c;基本步骤如下&#xff1a; 1、假定我们要对N个样本观测做聚类&#xff0c;要求聚为K类&#xff0c;首先选择K个点作为初始中心点&#xff1b; 2、接下来&#xff0c;按照距离初始中…

蓝桥杯官网填空题(三角形的面积)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 已知三角形三个顶点在直角坐标系下的坐标分别为&#xff1a; txt (2.3, 2.5) (6.4, 3.1) (5.1, 7.2) txt 求该三角形的面积。 注意&#xff0c;要提交的是一个小…

解决ROS2 humble版本源码编译中resdep init及rosdep update失败的问题

网上有在/etc/hosts中添加ip地址的方法&#xff0c;使用了不成功&#xff0c;具体做法如下&#xff0c;仅供参考&#xff1a; a.打开查询ip的网址&#xff1a; https://site.ip138.com b.输入&#xff1a;raw.githubusercontent.com c.执行sudo vi /etc/hosts 将获取到的ip添…

docker系列(3) - 常用软件安装

文章目录 3. docker安装常用软件3.1 安装nginx3.2 安装redis3.3 安装mysql3.4 部署springboot程序3.4.1 编写dockerfile3.4.2 构建镜像3.4.3 启动镜像 3. docker安装常用软件 3.1 安装nginx docker pull nginx#挂载启动 docker run -it -d \ --namenginx \ --networkpub_netw…

L2 数据仓库和Hive环境配置

1.数据仓库架构 数据仓库DW主要是一个用于存储&#xff0c;分析&#xff0c;报告的数据系统。数据仓库的目的是面向分析的集成化数据环境&#xff0c;分析结果为企业提供决策支持。-DW不产生和消耗数据 结构数据&#xff1a;数据库中数据&#xff0c;CSV文件 直接导入DW非结构…

2023高教杯数学建模2:DE题+参考论文、代码

2023高教杯数学建模2&#xff1a;DE题 写在最前面E题D题2014C题优秀论文笔记问题一&#xff08;求解母猪年均产仔量以达到或超过盈亏平衡点&#xff09;问题二&#xff08;求解小猪选为种猪的比例和母猪的存栏数&#xff09;问题三&#xff08;确定最佳经营策略&#xff0c;计算…

docker系列(4) - docker镜像制作

文章目录 4. docker镜像4.1 联合文件系统(UnionFS)4.2 Docker镜像加载原理4.3 docker commit(扩展镜像)(非常重要)4.3.1 案例4.3.1.1 下载ubuntu镜像4.3.1.2 安装vim4.3.1.3 commit新的镜像4.3.1.3 验证新的镜像 4. docker镜像 4.1 联合文件系统(UnionFS) Union文件系统(Unio…

树树树树树

//先序遍历 void PreOrder(BiTree T){if(T!NULL){printf("%c",T->data);PreOrder(T->lchild);PreOrder(T->rchild);} } //后序遍历 void PostOrder(BiTree T){if(T!NULL){PostOrder(T->lchild);PostOrder(T->rchild);printf("%c",T->dat…

美国星链再迎挑战,中国最有钱的通信企业争夺卫星互联网服务

随着一家手机企业发布5G卫星手机&#xff0c;卫星互联网服务的热度大增&#xff0c;业界人士指出目前能提供卫星互联网服务的仅有中国电信&#xff0c;但是中国移动已不甘落后&#xff0c;正在测试低轨道卫星互联网服务&#xff0c;这也是中国与美国星链竞争的序幕。 据了解日前…

表的约束类型

空属性约束 mysql有空属性和非空属性&#xff1a;null和not null 数据库默认字段基本都是字段为空&#xff0c;但是实际开发时&#xff0c;尽可能保证字段不为空&#xff0c;因为数据为空没办法参与运算 所以我们在设计数据库表的时候&#xff0c;一定要在表中进行限制&…

嵌入式:驱动开发 Day2

作业&#xff1a;字符设备驱动&#xff0c;完成三盏LED灯的控制 驱动代码&#xff1a; mychrdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include &q…

oracle表空间释放

oracle表空间释放 1&#xff09;查询表空间信息2&#xff09;查询指定表空间下各个表的表空间使用情况3-1&#xff09;可以直接释放3-2) 可以move3-3&#xff09;重新排列 1&#xff09;查询表空间信息 selecta.tablespace_name as "表空间名",total as "表空间…

初识Java 7-1 多态

目录 向上转型 难点 方法调用绑定 产生正确的行为 可扩展性 陷阱&#xff1a;“重写”private方法 陷阱&#xff1a;字段与静态方法 构造器和多态 构造器的调用顺序 继承和清理 构造器内部的多态方法行为 协变返回类型 使用继承的设计 替换和扩展 向下转型和反射…

Java开发之Mysql【面试篇 完结版】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、知识体系二、Mysql-优化1. 优化-如何定位慢查询① 问题引入② 解决方案③ 问题总结④ 实战面试 2. 优化-sql执行很慢&#xff0c;如何解决① 问题引入② 解…

AI项目五:结印动作识别

若该文为原创文章&#xff0c;转载请注明原文出处。 感谢恩培大佬对项目进行了完整的实现&#xff0c;并将代码进行开源&#xff0c;供大家交流学习。 恩培大佬开源地址&#xff0c;有兴趣的可以去复现一下。GitHub - enpeizhao/CVprojects: computer vision projects | 计算机…

计算机网路学习-time_wait过多

四次挥手 调试命令 netstat -an|awk ‘/tcp/ {print $6}’|sort|uniq -c netstat -an 列出系统中所有处于活动状态的网络连接信息&#xff0c;包括 IP 地址、端口号、协议等。 其中&#xff0c;第六列是tcp的状态。 Proto Recv-Q Send-Q Local Address Foreign Addr…