概述
S7.Net是一个専用にシーメンスPLC设计的PLC驱动程序,仅サポート経由イーサネット(イーサネット)连接。这意味着あなたのPLC必须具备Profinet CPU或Profinet外部卡(如CPxxx卡)。S7.Net完全使用C#编写,因此您可以轻松地进行デバッグ,而无需処理本地DLL。
サポート的PLC型号
S7.Net与以下型号的シーメンスPLC兼容:S7-200、S7-300、S7-400、S7-1200和S7-1500。
开始使用S7.Net
要开始使用S7.Net,您需要下载并包含S7.Net.dll到あなたの项目中。您可以経由下载NuGet包或下载源代码并编译来実装。
作成PLC实例、连接与断开
作成驱动程序实例时,您需要使用以下构造函数:
public Plc(CpuType cpu, string ip, Int16 rack, Int16 slot)
cpu:指定您要连接的CPUType。サポート的CPUタイプ有:
public enum CpuType {
S7200 = 0,
S7300 = 10,
S7400 = 20,
S71200 = 30,
S71500 = 40,
}ip:指定CPU或外部イーサネット(イーサネット)卡的IPaddress。rack:包含PLC的机架号,您可以在Step7的ハードウェアの構成中找到。slot:这是CPU的插槽号,同样可以在Step7的ハードウェアの構成中找到。
例如,以下代码为IPアドレス为127.0.0.1的S7-300 PLC作成了一个PLC对象,PLC位于0号机架,CPU位于2号插槽:
Plc plc = new Plc(CpuType.S7300, "127.0.0.1", 0, 2);
连接到PLC
public void Open()
例如,以下代码行打开连接:
plc.Open();
从PLC切断する
public void Close()
例如,以下代码接続を閉じる:
plc.Close();
エラー処理
任何方法都可能因为各种エラー而引发PlcException。您应该実装适当的エラー処理。PlcException提供了一个ErrorCode和一个适当的エラーメッセージ。
以下是エラータイプ的枚举:
public enum ErrorCode
{
NoError = 0,
WrongCPU_Type = 1,
ConnectionError = 2,
IPAddressNotAvailable,
WrongVarFormat = 10,
WrongNumberReceivedBytes = 11,
SendData = 20,
ReadData = 30,
WriteData = 50
}チェックPLC可用性
要チェックPLC是否可用(打开一个Socket),您可以使用属性:
public bool IsAvailable
当您チェック此属性时,驱动程序将尝试连接到PLC,并在能够连接时戻るtrue,否则戻るfalse。
チェックPLCconnect
チェックPLC连接很简单,因为您需要チェックPC套接字是否接続された,还要チェックPLC是否仍然连接在套接字的另一端。在这种情况下,您需要チェック的属性是:
public bool IsConnected
您可以在调用Open()方法并成功后チェック此属性,以表示连接是否仍然活跃。
読み取りバイト/写入バイト
该库提供了多种読み取り变量的方法。最基本且最もよく使われる方法是ReadBytes。
public byte[] ReadBytes(DataType dataType, int db, int startByteAdr, int count) public void WriteBytes(DataType dataType, int db, int startByteAdr, byte[] value)
此方法从给定的内存位置読み取り您指定的すべてのバイト。もしBytesの数超过了单次リクエスト可以传输的最大Bytesの数,此方法会自动処理多个リクエスト。
dataType:您必须使用枚举DataType指定内存位置:
public enum DataType
{
Input = 129,
Output = 130,
Memory = 131,
DataBlock = 132,
Timer = 29,
Counter = 28
}db:dataType的アドレス,例如,もし您想読み取りDB1,则此字段为“1”;もし您想読み取りT45,则此字段为45。startByteAdr:您要読み取り的第一バイト単位。的アドレス,例如,もし您想読み取りDB1.DBW200,则此为200。count:包含您想要読み取り的Bytesの数。value[]:要从PLC読み取り的Bytesの配列。
example:此方法読み取りDB1的前200バイト単位。:
var bytes = plc.ReadBytes(DataType.DataBlock, 1, 0, 200);
読み取り和解码/写入已解码
此方法允许您読み取り并受信基于提供的varType的已解码结果。这在您読み取り多个相同タイプ的字段时非常有用(例如20个连续的DBW)。もし您指定VarType.Byte,它与ReadBytes具有相同的功能。
public object Read(DataType dataType, int db, int startByteAdr, VarType varType, int varCount) public void Write(DataType dataType, int db, int startByteAdr, object value)
dataType:您必须使用枚举DataType指定内存位置。db:dataType的アドレス,例如,もし您想読み取りDB1,则此字段为“1”;もし您想読み取りT45,则此字段为45。startByteAdr:您要読み取り的第一バイト単位。的アドレス,例如,もし您想読み取りDB1.DBW200,则此为200。varType:指定您想要将バイト转换为的データ。
public enum VarType
{
Bit,
Byte,
Word,
DWord,
Int,
DInt,
Real,
String,
StringEx,
Timer,
Counter
}count:包含您想要読み取り的变量数量。value:要写入PLC的值配列。它可以是单个值或配列,只是请记住タイプ是唯一的(例如,double配列,int配列,shorts配列等)。
example:此方法読み取りDB1的前20个DWord:
var dwords = plc.Read(DataType.DataBlock, 1, 0, VarType.DWord, 20);
読み取り单个变量/写入单个变量
此方法経由解析ストリング·ストリング并戻る正确的结果,从PLC読み取り单个变量。虽然这是最简单的入門方法,但由于驱动程序为每个变量送信TCPRequest,因此非常低效。
public object Read(string variable) public void Write(string variable, object value)
variable:経由使用ストリング·ストリング如“DB1.DBW20”,“T45”,“C21”,“DB1.DBD400”等来指定要読み取り的变量。
example:这読み取り变量DB1.DBW0。结果必须转换为ushort以获得C#中正确的16位格式。
ushort result = (ushort)plc.Read("DB1.DBW0");読み取り構造体/写入構造体
此方法从指定的DB読み取りすべてのバイト,以填充C#中的構造体,并戻る包含值的構造体。当您想要読み取り单个データ块中的多个变量时,建议使用它。
“読み取り構造体”和“写入構造体”方法サポートなし。ストリング·ストリング。
public object ReadStruct(Type structType, int db, int startByteAdr = 0) public void WriteStruct(object structValue, int db, int startByteAdr = 0)
structType:要読み取り的構造体タイプ,例如:typeof(MyStruct)db:要読み取り的DB的索引startByteAdr:指定要読み取り的バイト的第一アドレスはこちら。(デフォルト为零)。
example:在PLC中定义一个DataBlock,然后在.Net应用程序中追加一个类似于PLC中DB的構造体:
public struct testStruct
{
public bool varBool0;
public bool varBool1;
public bool varBool2;
public bool varBool3;
public bool varBool4;
public bool varBool5;
public bool varBool6;
public byte varByte0;
public byte varByte1;
public ushort varWord0;
public float varReal0;
public bool varBool7;
public float varReal1;
public byte varByte2;
public UInt32 varDWord;
}然后追加代码以読み取り或写入完全的構造体:
// 从開始アドレス0読み取りDataBlock 1中的構造体 testStruct myTestStruct = (testStruct) plc.ReadStruct(typeof(testStruct), 1, 0);
**読み取り类/写
入类**
此方法从指定的DB読み取りすべてのバイト,以填充C#中的类。类作为引用传递,使用反射分配值。当您想要読み取り单个データ块中的多个变量时,建议使用它。
“読み取り类”和“写入类”方法サポートなし。ストリング·ストリング。
public void ReadClass(object sourceClass, int db, int startByteAdr = 0) public void WriteClass(object classValue, int db, int startByteAdr = 0)
sourceClass:您想要分配值的类的实例db:要読み取り的DB的索引startByteAdr:指定要読み取り的バイト的第一アドレスはこちら。(デフォルト为零)。
example:在PLC中定义一个DataBlock,然后在.Net应用程序中追加一个类似于PLC中DB的类:
public class TestClass
{
public bool varBool0 { get; set;}
public bool varBool1 { get; set;}
public bool varBool2 { get; set;}
public bool varBool3 { get; set;}
public bool varBool4 { get; set;}
public bool varBool5 { get; set;}
public bool varBool6 { get; set;}
public byte varByte0 { get; set;}
public byte varByte1 { get; set;}
public ushort varWord0 { get; set;}
public float varReal0 { get; set;}
public bool varBool7 { get; set;}
public float varReal1 { get; set;}
public byte varByte2 { get; set;}
public UInt32 varDWord { get; set;}
}然后追加代码以読み取り或写入完全的类:
// 从開始アドレス0読み取りDataBlock 1中的类 TestClass myTestClass = new TestClass(); plc.ReadClass(myTestClass, 1, 0);
読み取り多个变量
此方法在单个リクエスト中読み取り多个变量。变量可以位于相同或不同的データ块中。
public void Plc.ReadMultibleVars(List<DataItem> dataItems);
List<>:您必须指定包含すべての要読み取り的データ项的DataItemリスト。
example:此方法从データ块中読み取り几个变量:
首先定义データ项:
private static DataItem varBit = new DataItem()
{
DataType = DataType.DataBlock,
VarType = VarType.Bit,
DB = 83,
BitAdr = 0,
Count = 1,
StartByteAdr = 0,
Value = new object()
};…(中间省略了与上文重复的データ项定义)
然后定义一个リスト来存储DataItems:
private static List<DataItem> dataItemsRead = new List<DataItem>();
将データ项追加到リスト中:
dataItemsRead.Add(varBit); dataItemsRead.Add(varByteArray); dataItemsRead.Add(varInt); dataItemsRead.Add(varReal); dataItemsRead.Add(varString); dataItemsRead.Add(varDateTime);
openPLC连接并立即読み取り项目リスト:
myPLC.Open();
// 読み取り变量リスト
myPLC.ReadMultipleVars(dataItemsRead);
// 接続を閉じる
myPLC.Close();
// アクセスリスト的值
Console.WriteLine("Int:" + dataItemsRead[2].Value);写入多个变量
此方法在单个リクエスト中写入多个变量。
public void Plc.Write(Array[DataItem] dataItems);
Array[]您必须指定包含すべての要写入的项目的DataItem配列。
example:此方法将多个变量写入一个データ块:
定义データ项:
private static DataItem varWordWrite = new DataItem()
{
// ... (与上文重复的データ项定义省略)
};…(中间省略了与上文重复的データ项定义)
为データ项分配值。注意使用正确的データ変換,以适应S7データ型:
varWordWrite.Value = (ushort)67; varIntWrite.Value = (ushort)33; varDWordWrite.Value = (uint)444; varDIntWrite.Value = 6666; varRealWrite.Value = 77.89; varStringWrite.Value = "Writting";
然后定义一个リスト来存储データ项,并将作成的项目追加到リスト中:
private static List<DataItem> dataItemsWrite = new List<DataItem>(); // 将データ项追加到要写入的データ项リスト中 dataItemsWrite.Add(varWordWrite); dataItemsWrite.Add(varIntWrite); dataItemsWrite.Add(varDWordWrite); dataItemsWrite.Add(varDIntWrite); dataItemsWrite.Add(varRealWrite); dataItemsWrite.Add(varStringWrite);
最后,openPLC连接并一次性写入项目。使用.ToArray()将リスト转换为配列:
// 打开连接 myPLC.Open(); // 写入项目 myPLC.Write(dataItemsWrite.ToArray()); // 接続を閉じる myPLC.Close();
这件の記事提供了S7.Net软件的详细介绍,包括其功能、如何开始使用、如何作成PLC实例、连接与断开、エラー処理、チェックPLC的可用性和连接ステータス、読み取り和写入バイト、読み取り和写入構造体和类、以及如何一次性読み取り和写入多个变量。希望这件の記事能帮助您更好地了解S7.Net。
Leave a Reply