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


创建一个类文件,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 serverprivate void button1_Click(object sender, EventArgs e){//(1)创建opc server对象objServer = new OPCServer();//连接opc serverobjServer.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 serverprivate 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——>textBoxfor (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-->7int[] 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++;elsemath2.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

C# 异步多线程实现(二)Thread类
https://blog.csdn.net/xiaoyaolangwj/article/details/121922879
代码参考如下

class Program
{static void Main(string[] args){// 只能接受一个参数,并且必须是object类型的参数。Thread th = new Thread(Method1);th.IsBackground = true;th.Start(100);Console.WriteLine(Thread.CurrentThread.ManagedThreadId);// 第二种方法:单独创建一个关于Thread的类。类内封装一个要执行的方法,然后将参数通过类内字段传递。MyThread mt = new MyThread("xx.bt", "www.baidu.com");Thread th2 = new Thread(mt.Download);th2.Start();Thread th3 = new Thread(Method1);th3.Join();// 主线程中插入th3线程,只有当th3结束后,才继续往下执行。}static void Method1(object a){Console.WriteLine(a + "开始下载..."+Thread.CurrentThread.ManagedThreadId);Thread.Sleep(1000);Console.WriteLine("下载结束。");}
}public class MyThread 
{public string _name;public string _path;public MyThread(string fileName, string filePath){this._name = fileName;this._path = filePath;}public void Download(){Console.WriteLine("开始下载" + _name);Thread.Sleep(1000);Console.WriteLine("下载结束。"+ _path);}
}

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

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

相关文章

ChatGPT追祖寻宗:GPT-2论文要点解读

论文地址&#xff1a;Language Models are Unsupervised Multitask Learners 上篇&#xff1a;GPT-1论文要点解读 在上篇&#xff1a;GPT-1论文要点解读中我们介绍了GPT1论文中的相关要点内容&#xff0c;其实自GPT模型诞生以来&#xff0c;其核心模型架构基本没有太大的改变&a…

Vue中extend基本用法

1.Vue.extend(options) 参数: {Object} options用法&#xff1a; 使用基础Vue构造器&#xff0c;创建一个"子类"。参数是一个包含组件选项的对象。 data选项是特例&#xff0c;需要注意&#xff0c;在Vue.extend()中它必须是函数。 <html><head><tit…

读高性能MySQL(第4版)笔记08_创建高性能索引(上)

1. 索引 1.1. 键&#xff08;key&#xff09; 1.2. 存储引擎用于快速找到记录的一种数据结构 1.3. 当表中的数据量越来越大时&#xff0c;索引对性能的影响愈发重要 1.4. 在数据量较小且负载较低时&#xff0c;缺少合适的索引对性能的影响可能还不明显 1.5. 索引优化是对查…

C#__线程池的简单介绍和使用

/*线程池原理&#xff1a;&#xff08;有备无患的默认备用后台线程&#xff09;特点&#xff1a;线程提前建好在线程池;只能用于运行时间较短的线程。*/class Program{static void Main(string[] args){for (int i 0; i < 10; i){ThreadPool.QueueUserWorkItem(Download); …

【Redis】Redis作为缓存

【Redis】Redis常见面试题&#xff08;2&#xff09; 文章目录 【Redis】Redis常见面试题&#xff08;2&#xff09;1. 缓存2. Redis作为缓存2.1 缓存雪崩2.2 缓存穿透2.3 缓存击穿2.4 缓存雪崩、缓存穿透、缓存击穿的区别2.5 缓存预热2.6 如何保证缓存和MySQL双写一致 【Redis…

Java 设置免登录请求接口被拦截问题

1、在设置免登录时&#xff0c;前端将请求的路由添加到白名单后&#xff0c;请求接口还是被拦截到了&#xff0c;将请求接口也设置后还是会被拦截跳转到登录页面 通过JAVA 注解 Anonymous 进行设置匿名访问就可以了

【Unity编辑器扩展】| 自定义窗口和面板

前言【Unity编辑器扩展】| 自定义窗口和面板一、EditorWindow二、ScriptableWizard三、编辑器绘制3.1 文本输入3.2 空行3.3 滑动条、进度条3.4 枚举选择3.5 其他总结前言 前面我们介绍了Unity中编辑器扩展的一些基本概念及基础知识,还有编辑器扩展中用到的相关特性Attribute介…

华为云云耀云服务器L实例评测|服务器反挖矿防护指南

前言 本文为华为云云耀云服务器L实例测评文章&#xff0c;测评内容是 云耀云服务器L实例 反挖矿防护指南 系统配置&#xff1a;2核2G 3M CentOS7.9 之前的文章中『一文教你如何防御数据库恶意攻击』&#xff0c;我们讲到黑客如何通过攻击数据库来获取权限&#xff0c;以及我们…

pyarmor 加密许可证的使用

一 pyarmor 许可证的用处 文档&#xff1a;5. 许可模式和许可证 — Pyarmor 8.3.6 文档 试用版本有如下的限制&#xff1a; 加密功能对脚本大小有限制&#xff0c;不能加密超过限制的大脚本。 混淆字符串功能在试用版中无法使用。 RFT 加密模式&#xff0c;BCC 加密模式在试…

《确保安全:PostgreSQL安全配置与最佳实践》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

线性代数的本质(十)——矩阵分解

文章目录 矩阵分解LU分解QR分解特征值分解奇异值分解奇异值分解矩阵的基本子空间奇异值分解的性质矩阵的外积展开式 矩阵分解 矩阵的因式分解是把矩阵表示为多个矩阵的乘积&#xff0c;这种结构更便于理解和计算。 LU分解 设 A A A 是 m n m\times n mn 矩阵&#xff0c;…

【网络编程】深入理解TCP协议一(三次握手四次挥手、标记位、确认应答机制、超时重传机制)

TCP协议 1.三次握手四次挥手2.TCP协议段格式3.标记位介绍4.确认应答机制5.超时重传机制 1.三次握手四次挥手 当客户端发起连接请求时&#xff0c;SYN需要被设置位1&#xff0c;告诉服务器客户端希望建立一个链接服务器收到响应之后会回复 SYNACK&#xff0c;表示确认了客户端地…

利用Semaphore实现多线程调用接口A且限制接口A的每秒QPS为10

前段时间在群里面发现有个群友抛出一个实际需求&#xff1a;需要通过一个接口拉取数据&#xff0c;这个接口有每秒10QPS限制&#xff0c;请问如何实现数据拉去效率最大化且限制调用拉取接口每秒10PQPS&#xff1f;我觉得这个需求挺有意思的&#xff0c;跟某群友讨论&#xff0c…

莫比乌斯召回系统介绍

当前召回系统只能召回相关性高的广告&#xff0c;但不能保证该广告变现能力强。莫比乌斯做了如下两点创新&#xff1a; 在召回阶段&#xff0c;引入CPM等业务指标作为召回依据在召回阶段&#xff0c;引入CTR模型&#xff0c;从而召回更多相关性高且变现能力强的广告 参考 百度…

leetcode 26.删除有序数组中的重复项

给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你需要做…

5.k8s jenkins集成k8s一键发布案例

文章目录 前言一、jenkins配置1.1 jenkins配置git1.2 jenkins 配置maven1.3 jenkins配置java 二、jenkins流水线配置2.1.新增项目2.2 springboot项目配置git仓库2.3 springboot项目配置maven打包2.4 系统配置 ssh到hadoop1配置&#xff0c;也就是k8s的master节点2.6 springboot…

【多线程】常见的锁策略

常见的锁策略 1. 乐观锁 vs 悲观锁2. 读写锁 vs 普通互斥锁3. 重量级锁 vs 轻量级锁4. 自旋锁&#xff08;Spin Lock&#xff09;vs 挂起等待锁5. 公平锁 vs 非公平锁6. 可重入锁 vs 不可重入锁7. Synchronized8. 相关面试题 1. 乐观锁 vs 悲观锁 悲观锁&#xff1a; 总是假设…

安防监控系统/视频云存储EasyCVR平台视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

誉天在线项目~ElementPlus Tag标签用法

效果图 页面展现 <el-form-item label"课程标签"><el-tagv-for"tag in dynamicTags":key"tag"class"mx-1"closable:disable-transitions"false"close"handleClose(tag)"style"margin:5px;">…

Arcgis多值提取至点所有波段数值一样

Arcgis多值提取至点所有波段数值一样 问题描述 进行多值提取多波段后的结果&#xff0c;所有波段数值都是一样的。 原因 操作流程问题&#xff0c;输入栅格只选择了一个栅格文件 解决方案 实际上&#xff0c;每个波段都会对应一个栅格文件&#xff0c;要把这些添加进去 这…