S7DB类型
2023-12-22 07:02:43
DataType:
- 0x01 - BIT
- :一个无符号的bit
- 0x02?- BYTE
- :一个8位的数字
- 0x03?- CHAR
- :一个字符
- 0x04 - WORD
- :两个字节宽的无符号整数
- 0x05?- INT
- :两个字节宽的有符号整数。
- 0x06?- DWORD
- :四字节宽的无符号整数
- 0x07 - DINT
- :四字节宽的有符号整数
- 0x08 -?REAL
- :四个字节宽的IEEE浮点数
- 0x1c?- COUNTER
- :PLC程序计数器使用的计数器类型
西门子
?以下代码供参考,不保证能够正常编译。
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
public static class SiemensTypeHelper
{
public static void Parse(string input, out SiemensArea dataType, out int dbNumber, out SiemensVarType varType, out int address, out int bitNumber,out object defaultvalue)
{
bitNumber = -1;
dbNumber = 0;
defaultvalue = 0;
switch (input.Substring(0, 2))
{
case "DB":
string[] strings = input.Split(new char[] { '.' });
if (strings.Length < 2)
throw new InvalidAddressException("To few periods for DB address");
var pos = GetNumPosition(strings[1]);
dataType = SiemensArea.DataBlock;
dbNumber = int.Parse(strings[0].Substring(2));
address = int.Parse(strings[1].Substring(pos));
string dbType = strings[1].Substring(0, pos);
switch (dbType)
{
case "DBB":
case "BYTE":
varType = SiemensVarType.Byte;
defaultvalue = 0;
return;
case "WORD":
case "DBW":
varType = SiemensVarType.Word;
defaultvalue = 0;
return;
case "DINT":
varType = SiemensVarType.DInt;
defaultvalue = 0;
return;
case "DWORD":
case "DBE":
varType = SiemensVarType.DWord;
defaultvalue = 0;
return;
case "INT":
case "SHORT":
case "DBI":
varType = SiemensVarType.Int;
defaultvalue = 0;
return;
case "REAL":
case "DBR":
varType = SiemensVarType.Real;
defaultvalue = 0;
return;
case "STRING":
case "DBS":
varType = SiemensVarType.String;
defaultvalue = "";
return;
case "BOOLEAN":
case "DBX":
bitNumber = int.Parse(strings[2]);
if (bitNumber > 7)
throw new InvalidAddressException("Bit can only be 0-7");
varType = SiemensVarType.Bit;
defaultvalue = 0;
return;
default:
throw new InvalidAddressException();
}
case "EB":
// Input byte
dataType = SiemensArea.Input;
dbNumber = 0;
address = int.Parse(input.Substring(2));
varType = SiemensVarType.Byte;
defaultvalue = 0;
return;
case "EW":
// Input word
dataType = SiemensArea.Input;
dbNumber = 0;
address = int.Parse(input.Substring(2));
varType = SiemensVarType.Word;
defaultvalue = 0;
return;
case "ED":
// Input double-word
dataType = SiemensArea.Input;
dbNumber = 0;
address = int.Parse(input.Substring(2));
varType = SiemensVarType.DWord;
defaultvalue = 0;
return;
case "AB":
// Output byte
dataType = SiemensArea.Output;
dbNumber = 0;
address = int.Parse(input.Substring(2));
varType = SiemensVarType.Byte;
defaultvalue = 0;
return;
case "AW":
// Output word
dataType = SiemensArea.Output;
dbNumber = 0;
address = int.Parse(input.Substring(2));
varType = SiemensVarType.Word;
defaultvalue = 0;
return;
case "AD":
// Output double-word
dataType = SiemensArea.Output;
dbNumber = 0;
address = int.Parse(input.Substring(2));
varType = SiemensVarType.DWord;
defaultvalue = 0;
return;
case "MB":
// Memory byte
dataType = SiemensArea.Memory;
dbNumber = 0;
address = int.Parse(input.Substring(2));
varType = SiemensVarType.Byte;
defaultvalue = 0;
return;
case "MW":
// Memory word
dataType = SiemensArea.Memory;
dbNumber = 0;
address = int.Parse(input.Substring(2));
varType = SiemensVarType.Word;
defaultvalue = 0;
return;
case "MD":
// Memory double-word
dataType = SiemensArea.Memory;
dbNumber = 0;
address = int.Parse(input.Substring(2));
varType = SiemensVarType.DWord;
defaultvalue = 0;
return;
default:
switch (input.Substring(0, 1))
{
case "E":
case "I":
// Input
dataType = SiemensArea.Input;
varType = SiemensVarType.Bit;
break;
case "A":
case "O":
// Output
dataType = SiemensArea.Output;
varType = SiemensVarType.Bit;
break;
case "M":
// Memory
dataType = SiemensArea.Memory;
varType = SiemensVarType.Byte;
break;
case "T":
// Timer
dataType = SiemensArea.Timer;
dbNumber = 0;
address = int.Parse(input.Substring(1));
varType = SiemensVarType.Timer;
return;
case "Z":
case "C":
// Counter
dataType = SiemensArea.Timer;
dbNumber = 0;
address = int.Parse(input.Substring(1));
varType = SiemensVarType.Counter;
return;
default:
throw new InvalidAddressException(string.Format("{0} is not a valid address", input.Substring(0, 1)));
}
string txt2 = input.Substring(1);
if (txt2.IndexOf(".") == -1)
throw new InvalidAddressException("To few periods for DB address");
address = int.Parse(txt2.Substring(0, txt2.IndexOf(".")));
bitNumber = int.Parse(txt2.Substring(txt2.IndexOf(".") + 1));
if (bitNumber > 7)
throw new InvalidAddressException("Bit can only be 0-7");
return;
}
}
private static int GetNumPosition(string str)
{
var regex = new Regex(@"\d");
return regex.Match(str).Index;
}
}
文章来源:https://blog.csdn.net/daonidedie/article/details/135130371
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!