1作用:
实现自己想要的功能。
由于某些功能自己不会写,或者写起来过于繁琐,可以直接用别人写好的方法来做。
设计:以库为模块单位,(库内新建对象再新建方法)
使用:1需要using命名空间后,2再 new出类(); ,3再实例对象调用方法
new出类后,cal 才能调用方法。
2怎么做:必须是在使用的项目下的引用,尤其是ui控件类
项目右击》引用》管理 NuGet 程序包 》
1搜:SeeSharpTools (这个是ui控件,比如指示灯什么的)
2搜 : NModbus4 ( 这个是modbus库 )
thinger.DataConvertLib 这个是常用数据类型转换
xktComm 这个是喜课堂库(包含西门子PLC读写)
3搜 : PCHMI ( 这个是通讯库 )
3怎么用:
注意:{ }名字,这个是命名空间名称,一定要using它,才能new里面的对象。
{ }Modbus.Device // 那么第一步就要 using Modbus.Device;
下一步就要 new 出对象。
别人写的库看不到源码,都是dll文件。只能看到方法名,找出自己需要的。
一般去参考老师的程序是怎么写的。
1 引用命名空间: using Modbus.Device; // 驱动连接
2 先 new个null 对象; private ModbusSerialMaster modbus = null;
private SerialPort serialPort = null;
3在项目里再传属性; this.serialPort = new SerialPort ();
PCHMI.CONFIG config1 = new PCHMI.CONFIG();
config1.通讯配置 = new string [] { "SIEMENS_S7;192.168.10.50;102;SLOT=1;" };
PCHMI.数据显示器 DBTXT = new PCHMI.数据显示器();
DBTXT.监控地址 = "DB1.0";
Controls.Add(DBTXT);
config1.START((Control)this, System.Reflection.Assembly.GetExecutingAssembly(), null);
3分析方法:查看方法体
别人写好的方法,看不到方法体,想去了解别人是怎样实现这个功能的。
重启一下VS软件
方法右击
这就看到该方法的方法体了。
//================================================================
西门子库: plc专用
装好后,找出需要用的方法。先new出对象
using S7.Net; 西门子的库,命名空间
new出对象;
//字段位置
private PLC plc = null;
// 按钮事件内
// cpu类型,地址,机架号,槽号
this.plc = new PLC( CpuType.S71200,"192.168.1.200",0,2);
this.plc.Open();
this.plc?.Close(); // 对象非空null
// 写
// bit
Plc.WriteBit(S7.Net.DataType, int, int, int, bool)//DB1.DBW200, 1,200,0,true
摘要:
从具有指定索引的DB中写入单个位。
参数:
dataType:存储区的数据类型,可以是DB、计时器、计数器、合并器(内存)、输入、输出。
db:内存区域的地址(如果要读取DB1,则将其设置为1)。对于其他内存区域类型:计数器、计时器等,也必须设置此值。
startByteAdr:起始字节地址。如果你想写DB1.DBW200,这是200。
bitAdr:位的地址。(0-7)
value:要写入的字节。如果超过200,将发出多个请求。
this.plc.Write("DB1.DBW0",ushort.Parse("10086"));
// 读
Plc.Read(string)
摘要:
从PLC读取单个变量,接受输入字符串,如“DB1.DBX0.0”、“DB20.DBD200”、“MB20”、“T45”等。如果读取不成功,请检查LastErrorCode或LastErorString。
参数:
变量:输入字符串,如“DB1.DBX0.0”、“DB20.DBD200”、“MB20”、“T45”等。
返回结果:
返回包含该值的对象。此对象必须相应地进行转换。如果未读取任何数据,将返回null
Plc.ReadBytes(S7.Net.DataType, int, int, int)
摘要:
从指定的索引开始读取DB中的字节数。这将处理200多个字节的多个请求。如果读取未成功,请检查LastErrorCode或LastErorString。
参数:
dataType:存储区的数据类型,可以是DB、计时器、计数器、合并器(内存)、输入、输出。
db:内存区域的地址(如果要读取DB1,则将其设置为1)。对于其他内存区域类型:计数器、计时器等,也必须设置此值。
startByteAdr:起始字节地址。如果您想读取DB1.DBW200,这是200。
count:字节计数,如果要读取120字节,请将其设置为120。
返回结果:
返回数组中的字节
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using S7.Net;
namespace MeProgram
{
public class S7NetPlc
{
Plc plc;
/// <summary>
/// 初始化S7NetPLC
/// </summary>
/// <param name="IP"></param>
/// <param name="CPUType"></param>
public S7NetPlc(string IP, string CPUType ="S71200")
{
CreatePlc(IP, CPUType);
}
/// <summary>
/// 实例化PLC IP和CPU型号 CPU型号默认S71200
/// </summary>
/// <param name="ip"></param>
/// <param name="cpu"></param>
void CreatePlc(string ip, string cpu)
{
CpuType cputype = new CpuType();
if (Enum.TryParse(cpu.ToUpper(), out cputype))
{
plc = new Plc(cputype, ip, 0, 1);
}
else
{
Console.WriteLine("CPU型号错误");
}
}
/// <summary>
/// 连接PLC 再次调用可重新连接
/// </summary>
public async void Connet()
{
try
{
await plc.OpenAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
/// <summary>
/// PLC连接状态
/// </summary>
/// <returns></returns>
public bool ConnetStatus()
{
return plc.IsConnected;
}
#region 读取PLC数据
/// <summary>
/// 读取PLC 输入点 i
/// </summary>
/// <param name="start">开始的地址</param>
/// <param name="字节数">读取字节数量</param>
/// <returns></returns>
public BitArray Get_I(int 地址I点, int 数量)
{
BitArray bitArray = new BitArray(数量);
try
{
if (plc.IsConnected)
{
bitArray = (BitArray)plc.Read(DataType.Input, 0, 地址I点, VarType.Bit, 数量);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return bitArray;
}
/// <summary>
/// 读取PLC 输出点Q
/// </summary>
/// <param name="start">开始的地址</param>
/// <param name="字节数">读取字节数量</param>
/// <returns></returns>
public BitArray Get_Q(int 地址Q点, int 数量)
{
BitArray bitArray = new BitArray(数量);
try
{
if (plc.IsConnected)
{
bitArray = (BitArray)plc.Read(DataType.Output, 0, 地址Q点, VarType.Bit, 数量);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return bitArray;
}
/// <summary>
/// 读取PLC默认寄存器地址
/// </summary>
/// <param name="地址M点"></param>
/// <param name="字节数"></param>
/// <returns></returns>
public BitArray Get_M(int 地址M点, int 数量)
{
BitArray bitArray = new BitArray(数量);
try
{
if (plc.IsConnected)
{
bitArray = (BitArray)plc.Read(DataType.Memory, 0, 地址M点, VarType.Bit, 数量);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return bitArray;
}
/// <summary>
/// 批量读取连续的 bool 值
/// </summary>
/// <param name="DB"></param>
/// <param name="起始地址"></param>
/// <param name="数量"></param>
/// <returns></returns>
public BitArray Get_BitArray(int DB, int 偏移量, int 数量)
{
BitArray bitArray = new BitArray(数量);
try
{
if (plc.IsConnected)
{
bitArray = (BitArray)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.Bit, 数量);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return bitArray;
}
/// <summary>
/// 读取PLC DB块字节数据
/// </summary>
/// <param name="DB">DB块</param>
/// <param name="start">开始的偏移量</param>
/// <param name="字节数">读取的长度</param>
/// <returns></returns>
public byte[] Get_bytes(int DB, int 偏移量, int 数量)
{
byte[] db_byte = new byte[数量];
try
{
if (plc.IsConnected)
{
db_byte = plc.ReadBytes(DataType.DataBlock, DB, 偏移量, 数量);
}
}
catch (Exception ex)
{
Console.WriteLine("读取PLC_byte_Error:" + ex.Message);
}
return db_byte;
}
/// <summary>
/// 读取PLC DB快16位有符号数据
/// </summary>
/// <param name="绝对地址"></param>
/// <returns></returns>
public short Get_int(int DB, int 偏移量)
{
short data = 0;
try
{
if (plc.IsConnected)
{
data = (short)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.Int, 1);
}
}
catch (Exception ex)
{
Console.WriteLine("读取PLC_int_Error:" + ex.Message);
}
return data;
}
/// <summary>
/// 读取PLC DB块32位有符号数据
/// </summary>
/// <param name="DB"></param>
/// <param name="偏移量"></param>
/// <returns></returns>
public int Get_Dint(int DB, int 偏移量)
{
int data = 0;
try
{
if (plc.IsConnected)
{
data = (int)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.DInt, 1);
}
}
catch (Exception ex)
{
Console.WriteLine("读取PLC_Dint出错:" + ex.Message);
}
return data;
}
/// <summary>
/// 读取PLC DB快16位无符号数据
/// </summary>
/// <param name="绝对地址"></param>
/// <returns></returns>
public ushort Get_Word(int DB, int 偏移量)
{
ushort data = 0;
try
{
if (plc.IsConnected)
{
data = (ushort)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.Word, 1);
}
}
catch (Exception ex)
{
Console.WriteLine("读取PLC_Word_Error:" + ex.Message);
}
return data;
}
/// <summary>
/// 读取PLC DB快32位无符号数据
/// </summary>
/// <param name="DB"></param>
/// <param name="偏移量"></param>
/// <returns></returns>
public uint Get_DWord(int DB, int 偏移量)
{
uint data = 0;
try
{
if (plc.IsConnected)
{
data = (uint)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.DWord, 1);
}
}
catch (Exception ex)
{
Console.WriteLine("读取PLC_DWord出错:" + ex.Message);
}
return data;
}
/// <summary>
/// 读取PLC Timer 类型数据
/// </summary>
/// <param name="绝对地址"></param>
/// <returns></returns>
public int Get_Timer(string 绝对地址)
{
object ss = 0;
try
{
if (plc.IsConnected)
{
ss = plc.Read(绝对地址.ToUpper());
}
}
catch (Exception ex)
{
Console.WriteLine("读取PLC_Timer_Error:" + ex.Message);
}
int fs = Convert.ToInt32(ss);
return fs;
}
/// <summary>
/// 读取PLC Real 类型数据
/// </summary>
/// <param name="绝对地址">PLC绝对地址</param>
/// <returns></returns>
public float Get_Real(int DB, int 偏移量)
{
float result = 0;
try
{
if (plc.IsConnected)
{
result = (float)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.Real, 1);
}
}
catch (Exception ex)
{
Console.WriteLine("读取PLC_Real_Error:" + ex.Message);
}
return result;
}
/// <summary>
/// 读取PLC string 类型数据
/// </summary>
/// <param name="DB">DB块</param>
/// <param name="偏移地址">开始的偏移量</param>
/// <returns></returns>
public string Get_String(int DB, int 偏移量)
{
string 返回值 = string.Empty;
try
{
if (plc.IsConnected)
{
//西门子字符串长度 第一个字节是字符串的总长度 第二个是字符串的当前长度 要从当前字节的+1字节读取当前长度
var bytelen = (byte)plc.Read(DataType.DataBlock, DB, 偏移量 + 1, VarType.Byte, 1);
返回值 = (string)plc.Read(DataType.DataBlock, DB, 偏移量 + 2, VarType.String, bytelen);
}
}
catch (Exception ex)
{
Console.WriteLine("读取PLC_String_Error:" + ex.Message);
}
return 返回值;
}
#endregion
#region 写入PLC数据
/// <summary>
/// 写入PLC输出点Q 地址
/// </summary>
/// <param name="输出Q">Q5.0 的5</param>
/// <param name="第几位">Q5.4 的4</param>
/// <param name="值">值</param>
public void Set_Q(int 输出Q, int 第几位, bool 值)
{
try
{
if (plc.IsConnected)
{
plc.WriteBit(DataType.Output, 0, 输出Q, 第几位, 值);
}
}
catch (Exception ex)
{
Console.WriteLine("写入Q点出错:" + ex.Message);
}
}
/// <summary>
/// 写入PLC默认寄存器地址
/// </summary>
/// <param name="地址M"></param>
/// <param name="第几位"></param>
/// <param name="值"></param>
public void Set_M(int 地址M, int 第几位, bool 值)
{
try
{
if (plc.IsConnected)
{
plc.WriteBit(DataType.Memory, 0, 地址M, 第几位, 值);
}
}
catch (Exception ex)
{
Console.WriteLine("写入M地址:" + ex.Message);
}
}
/// <summary>
/// 写入PLCDB块 bool 类型地址
/// </summary>
/// <param name="DB"></param>
/// <param name="偏移量">分配的第几个字节</param>
/// <param name="第几位">字节里的第几位</param>
/// <param name="值"></param>
public void Set_Bit(int DB, int 偏移量, int 第几位, bool 值)
{
try
{
if (plc.IsConnected)
{
plc.WriteBit(DataType.DataBlock, DB, 偏移量, 第几位, 值);
}
}
catch (Exception ex)
{
Console.WriteLine("写入PLC_bool出错:" + ex.Message);
}
}
/// <summary>
/// 写入PLC DB块16位有符号数据
/// </summary>
/// <param name="绝对地址"></param>
/// <param name="值"></param>
public void Set_int(string 绝对地址, short 值)
{
try
{
if (plc.IsConnected)
{
plc.Write(绝对地址.ToUpper(), 值);
}
}
catch (Exception ex)
{
Console.WriteLine("写入PLC_int出错:" + ex.Message);
}
}
/// <summary>
/// 写入PLC DB块32位有符号数据
/// </summary>
/// <param name="绝对地址"></param>
/// <param name="值"></param>
public void Set_Dint(string 绝对地址, int 值)
{
try
{
if (plc.IsConnected)
{
plc.Write(绝对地址.ToUpper(), 值);
}
}
catch (Exception ex)
{
Console.WriteLine("写入PLC_Dint出错:" + ex.Message);
}
}
/// <summary>
/// 写入PLC DB块16位无符号数据
/// </summary>
/// <param name="绝对地址"></param>
/// <param name="值"></param>
public void Set_Word(string 绝对地址, ushort 值)
{
try
{
if (plc.IsConnected)
{
plc.Write(绝对地址.ToUpper(), 值);
}
}
catch (Exception ex)
{
Console.WriteLine("写入PLC_Word出错:" + ex.Message);
}
}
/// <summary>
/// 写入PLC DB块32位无符号数据
/// </summary>
/// <param name="绝对地址"></param>
/// <param name="值"></param>
public void Set_DWord(string 绝对地址, uint 值)
{
try
{
if (plc.IsConnected)
{
plc.Write(绝对地址.ToUpper(), 值);
}
}
catch (Exception ex)
{
Console.WriteLine("写入PLC_DWord出错:" + ex.Message);
}
}
/// <summary>
/// 写入PLC Real 类型地址
/// </summary>
/// <param name="绝对地址"></param>
/// <param name="值"></param>
public void Set_Real(string 绝对地址, float 值)
{
try
{
if (plc.IsConnected)
{
plc.Write(绝对地址.ToUpper(), 值);
}
}
catch (Exception ex)
{
Console.WriteLine("写入PLC_Real出错:" + ex.Message);
}
}
/// <summary>
/// 写入PLC Timer 类型地址
/// </summary>
/// <param name="绝对地址"></param>
/// <param name="值"></param>
public void Set_Timer(string 绝对地址, int 值)
{
try
{
if (plc.IsConnected)
{
plc.Write(绝对地址.ToUpper(), 值);
}
}
catch (Exception ex)
{
Console.WriteLine("写入PLC_Timer出错:" + ex.Message);
}
}
/// <summary>
/// 写入PLC string 类型地址
/// </summary>
/// <param name="DB">DB块</param>
/// <param name="偏移地址">分配的偏移量</param>
/// <param name="值"></param>
public void Set_String(int DB, int 偏移量, string Values)
{
try
{
if (plc.IsConnected)
{
var lenMax = (byte)plc.Read(DataType.DataBlock, DB, 偏移量, VarType.Byte, 1);//拿到地址申请的字节长度
plc.Write(DataType.DataBlock, DB, 偏移量, GetStringByteArray(lenMax, Values));
}
}
catch (Exception ex)
{
Console.WriteLine("写入PLC_String出错:" + ex.Message);
}
}
/// <summary>
/// 把 string数据 转换成西门子String数据格式
/// </summary>
/// <param name="datastring"></param>
/// <returns></returns>
private byte[] GetStringByteArray(byte LenMax, string Values)
{
byte[] byteArray = Encoding.Default.GetBytes(Values);
byte[] sheel = new byte[2];
sheel[0] = Convert.ToByte(LenMax);//申请的最大内存
sheel[1] = Convert.ToByte(Values.Length);//当前字符长度
return sheel.Concat(byteArray).ToArray();
}
#endregion
}
}