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.rhkb.cn/news/131990.html

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

相关文章

无涯教程-JavaScript - ISNA函数

描述 如果指定的值为Excel&#xff03;N/A错误值,或者表达式返回Excel&#xff03;N/A错误,则ISNA函数将返回逻辑值TRUE。否则返回FALSE。当值不可用于您的公式时,将发生Excel&#xff03;N/A错误。 语法 ISNA (value)争论 Argument描述Required/OptionalvalueValue or exp…

《算法竞赛·快冲300题》每日一题:“点灯游戏”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 点…

vue cli 打包、生产环境http-proxy-middleware代理

结构树 版本 1、创建vue.config.js const path require(path); const UglifyJsPlugin require(uglifyjs-webpack-plugin) //压缩 const CompressionWebpackPlugin require(compression-webpack-plugin) const isProduction process.env.NODE_ENV ! development;module.exp…

请求与响应以及REST风格

目录 请求与响应请求参数参数传递 五种类型参数传递普通参数POJO数据类型嵌套POJO类型参数数组类型参数集合类型参数 JSON数据传输参数JSON普通数组JSON对象数据JSON对象数组知识点1&#xff1a;EnableWebMvc知识点2&#xff1a;RequestBodyRequestBody与RequestParam区别日期类…

[SICTF 2023] webmisc

文章目录 webBaby_PHP涉及知识点 我全都要RCE你能跟得上我的speed吗 miscPixel_art攻破这个压缩包&#xff01; web Baby_PHP 涉及知识点 php解析特性apache换行解析漏洞无参RCE 源代码 <?php highlight_file(__FILE__); error_reporting(0);$query $_SERVER[QUERY_ST…

OpenCV Series : Target Box Outline Border

角点 P1 (255, 000, 000) P2 (000, 255, 000) P3 (000, 000, 255) P4 (000, 000, 000)垂直矩形框 rect cv2.minAreaRect(cnt)targetColor roi_colortargetThickness 1targetColor (255, 255, 255)if lineVerbose:if True:cv2.line(ph…

做机器视觉工程师,其实挺没意思的

3.康耐视VisionPro高级脚本系列教程-3.脚本编辑错误和运行错误调试方法&#xff0c;break和Contitinuee的差别_哔哩哔哩_bilibili 其实人生就是“有时有意思&#xff0c;有时没意思”。 心里有太多的不甘心&#xff0c;太多的苦水&#xff0c;是没法再吃学习的苦&#xff0c…

市场调查中的信度和效度分析原理及python实现示例

市场调查中的信度和效度分析 1.量表信度分析1.1 内部一致性信度&#xff1a;克朗巴赫α系数原理1.2 python实现示例 2.量表效度分析2.1 内容效度2.1.1 原理2.1.2 python实现示例 2.2 准则效度2.2.1 原理2.2.2 python实现示例 2.3 结构效度2.3.1 原理2.3.2 python实现示例 3.量表…

[PyTorch][chapter 54][GAN- 1]

前言&#xff1a; GAN playground: Experiment with Generative Adversarial Networks in your browser 生成对抗网络&#xff08;Generative Adversarial Nets&#xff0c;GAN&#xff09;是一种基于对抗学习的深度生成模型&#xff0c;最早由Ian Goodfellow于2014年在《Gener…

selenium.chrome怎么写扩展拦截或转发请求?

Selenium WebDriver 是一组开源 API&#xff0c;用于自动测试 Web 应用程序&#xff0c;利用它可以通过代码来控制chrome浏览器&#xff01; 有时候我们需要mock接口的返回&#xff0c;或者拦截和转发请求&#xff0c;今天就来实现这个功能。 代码已开源&#xff1a; https:/…

使用java连接Libvirtd

基于springboot web 一、依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId>&l…

用c语言编写出三底模型

以下是一个用C语言实现三底模型的示例代码。这个程序通过循环遍历输入的股票数据&#xff0c;判断是否出现三底形态&#xff0c;如果是&#xff0c;则输出买入信号&#xff0c;否则输出卖出信号。 c语言 #include <stdio.h> #include <stdlib.h> // 判断是否出现…

Java项目---图片服务器

图片服务器--->服务器&#xff08;图床&#xff09; 核心功能&#xff1a;上传图片、展示图片等 比如&#xff1a;编写博客时我们会插入图片&#xff0c;本质上是往文章中放了一个链接&#xff08;URL&#xff09;&#xff0c;这个URL资源在另外一个服务器上。 核心知识点…

FPGA 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存HDMI输出 5、vivado工程详解PL端FPGA硬件设…

无涯教程-JavaScript - INFO函数

描述 INFO函数返回有关当前操作环境的信息。 语法 INFO (type_text) 争论 Argument描述Required/OptionalType_text 指定要返回的信息类型的文本。 下表给出了Type_text的值和相应的返回信息。 Required Type_text 返回的信息"目录" 当前目录或文件夹的路径。&qu…

【Proteus仿真】【STM32单片机】四驱寻迹避障小车

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 系统运行后&#xff0c;LCD1602显示红外、超声波检测状态和距离、小车运行状态。可通过K1键可手动切换模式&#xff0c;寻迹、避障、蓝牙遥控&#xff1b;也可通过蓝牙发送指令切换模式&#xff1b; 当处…

系统架构设计之道,论如何构建一个资金账户系统

&#x1f449;导读 资金账户是互联网和金融业务中非常常见的系统&#xff0c;尤其是在电商、支付等业务中必不可少。资金账户系统本身其核心模块的整体架构往往并不复杂&#xff0c;但其对于资金安全和可用性的要求非常高&#xff0c;导致建设好一个资金账户系统并不容易。本文…

【Spring Boot】有这一文就够了

作者简介 前言 作者之前写过一个Spring Boot的系列&#xff0c;包含自动装配原理、MVC、安全、监控、集成数据库、集成Redis、日志、定时任务、异步任务等内容&#xff0c;本文将会一文拉通来总结这所有内容&#xff0c;不骗人&#xff0c;一文快速入门Spring Boot。 专栏地址…

MySQL安装validate_password_policy插件

功能介绍 validate_password_policy 是插件用于验证密码强度的策略。该参数可以设定三种级别&#xff1a;0代表低&#xff0c;1代表中&#xff0c;2代表高。 validate_password_policy 主要影响密码的强度检查级别&#xff1a; 0/LOW&#xff1a;只检查密码长度。 1/MEDIUM&am…

YashanDB:潜心实干,数据库核心技术突破没有捷径可走

都说数据库是三大基础软件中的一块硬骨头&#xff0c;技术门槛高、研发周期长、工程要求高&#xff0c;市场长期被几大巨头所把持。 因此&#xff0c;实现突破一直是中国数据库产业的夙愿。自上个世纪80年代起&#xff0c;中国数据库产业走过艰辛坎坷的四十余载&#xff0c;终…