您的位置:首页 > 编程语言 > C#

c# Opc服务

2020-05-08 04:20 2815 查看
namespace OpcDal
{
public class opcclient
{
ItemModel m = new ItemModel();
private string[] ItemName { get; set; }
private string[] valuess { get; set; }
private opcclient()
{
//times = System.DateTime.Now.ToString();
//Console.WriteLine(times);
try
{
Opcsere();
}
catch (Exception)
{

throw;
}

}
private static opcclient opcc = new opcclient();
public static opcclient GetOpcClient()
{
return opcc;
}
XmlDocument doc = new XmlDocument();
OpcDaServer opcsever;
OpcDaGroup group;
public bool Opcsere()//远程连接应用
{
try
{
doc.Load(@"F:\work\che\OpcDal\Opc.xml");
}
catch (Exception)
{
return false;
throw;
}
string progIdOrClsid = "Techon.OpcDa30Server.1";
string hostname = "WIN-C3GNU98OINA";//WIN-C3GNU98OINA/192.122.0.98

opcsever = new OpcDaServer(progIdOrClsid, hostname);
try
{
opcsever.Connect();
}
catch (Exception ex)
{
return false;
}
Browser(opcsever);
return Opcgroup();
}
public bool Opcgroup(OpcDaGroupState state = null)//建opc组
{
string name = "grop";

group = opcsever.AddGroup(name, state);
group.IsActive = true;

OpcDaItemDefinition[] definition = new OpcDaItemDefinition[brows.Count];

for (int i = 0; i < brows.Count; i++)
{
definition[i] = new OpcDaItemDefinition
{
ItemId = brows[i].ItemId,
IsActive = true
};
}
//  string item = string.Format(@"insert into opchttp values('{0}')", m.ItemId);
OpcDaItemResult[] results = group.AddItems(definition);
Read(group);

return true;
}
private List<OpcDaBrowseElement> brows = new List<OpcDaBrowseElement>();
public string[] Browss()
{
string[] bs = new string[brows.Count];
for (int i = 0; i < brows.Count; i++)
{
bs[i] = brows[i].Name.ToString();
}
return bs;
}
public OpcDaBrowserAuto Browser(OpcDaServer server)//远程浏览
{
// 创建一个浏览器并递归浏览器所有元素
var browsers = new OpcDaBrowserAuto(server);
brows.Clear();
BrowseChildren(browsers);
return browsers;
}
public void BrowseChildren(IOpcDaBrowser browser, string itemId = null, int indent = 0)
{
//当itemid为空时,浏览根目录
OpcDaBrowseElement[] br = browser.GetElements(itemId);
brows.AddRange(br.ToArray<OpcDaBrowseElement>());
// 输出 elements.
foreach (OpcDaBrowseElement element in br)
{

// 跳过没有子元素的元素
if (!element.HasChildren)
continue;

// 输出元素的子元素
BrowseChildren(browser, element.ItemId, indent + 2);
}
}
public async Task<OpcDaItemValue[]> AsyncRead(OpcDaGroup group)
{
values = await group.ReadAsync(group.Items);
group.ValuesChanged += OnGroupValuesChang;
group.UpdateRate = TimeSpan.FromMilliseconds(100);
Checkvalue();
return values;
}
public List<OpcDaItemValue> Red=new List<OpcDaItemValue>();
public List<OpcDaItemValue>Blue=new List<OpcDaItemValue>();
public List<ItemModel> ims = new List<ItemModel>();
//跟新警告
public void Checkvalue()
{
foreach (var item in values)
{
var ite = ims.Find(delegate (ItemModel im) { return im.ItemId == item.Item.ItemId; });
decimal v1;
try
{
v1 = decimal.Parse(item.Value.ToString());
}
catch
{
if (bool.Parse(item.Value.ToString()))
{
v1 = 1;
}
else
{
v1 = 0;
}
}
if (ite.Redmax < v1 || ite.Redmin > v1)
{
Red.Add(item);
}
else if (ite.Bluemax < v1 || ite.Bluemin > v1)
{
Blue.Add(item);
}
var max = MaxVue.Find(delegate (OpcDaItemValue im) { return im.Item.ItemId == item.Item.ItemId; });
var min = MinVue.Find(delegate (OpcDaItemValue im) { return im.Item.ItemId == item.Item.ItemId; });
if (Convert.ToDecimal(max.Value)<Convert.ToDecimal(item.Value))
{
MaxVue.Add(item);
}
if(Convert.ToDecimal(min.Value) > Convert.ToDecimal(item.Value))
{
MinVue.Add(item);
}
}

}
public List<OpcDaItemValue> MaxVue = new List<OpcDaItemValue>();
public List<OpcDaItemValue> MinVue = new List<OpcDaItemValue>();
public List<histors> ht = new List<histors>();
ItemModel itm = new ItemModel();
//存入数据库
public int ue(histors h)
{
foreach (var item in MaxVue)
{
var vue = MinVue.Find(delegate (OpcDaItemValue tor) { return tor.Item.ItemId == item.Item.ItemId; });
var sa = h.ImId;
itm.Id = sa;
itm.ItemId = item.Item.ItemId;
h.MaxValue = Convert.ToDecimal(item.Value);
h.MinValue = Convert.ToDecimal(vue.Value);
h.hosTime = System.DateTime.Now.Date;
ht.Add(h);
ims.Add(itm);
// ht.Add(h);
}
MaxVue = values.ToList<OpcDaItemValue>();
MinVue = values.ToList<OpcDaItemValue>();
string sql =string .Format("insert into histors(MaxValue,MinValue,hosTime,ImId) values(MaxValue={0},MinValue={1},hosTime='{2}',ImId={3})", h.MaxValue, h.MinValue, h.hosTime, h.ImId);

var ss=Dapperhelper.dapper.Execute(sql);
return  ss;
}
public OpcDaItemValue[] Read(OpcDaGroup group)
{
values = group.Read(group.Items, OpcDaDataSource.Device);
group.ValuesChanged += OnGroupValuesChang;
group.UpdateRate = TimeSpan.FromMilliseconds(100);
Checkvalue();
return values;
}
private OpcDaItemValue[] values;

public class item
{
public item(string it, string va)
{
itemname = it;
value = va;
}
public string itemname;
public string value;
}
public item[] Getvalue()//读取
{
item[] vs = new item[values.Length];
for (int i = 0; i < values.Length; i++)
{
item it = new item(values[i].Item.ItemId, values[i].Value.ToString());
vs[i] = it;
}
return vs;
}
public string Getvalue(int index)
{
return values[index].Value.ToString();

}
public string Getvalue(string itemName)
{
foreach (var item in values)
{
if (item.Item.ItemId == itemName)
{
return item.Value.ToString();
}
}
return "";
}
private void OnGroupValuesChang(object sender, OpcDaItemValuesChangedEventArgs args)
{
foreach (OpcDaItemValue value in args.Values)
{
//  string ass= "select ItemId,Value,Quality,Timestamp from opchttp";

}
}
private OpcDaItem[] iten;
public string[] Getiten()
{
string[] itemName = new string[iten.Length];
for (int i = 0; i < iten.Length; i++)
{
itemName[i] = iten[i].ItemId.ToString();
}
return itemName;
}
public int[] Writes(string[] ItemName, object[] values)//修改设备的值
{

iten = new OpcDaItem[ItemName.Length];
for (int i = 0; i < ItemName.Length; i++)
{
iten[i] = group.Items.FirstOrDefault(j => j.ItemId == ItemName[i]);
}
// Write values to the items synchronously.
HRESULT[] results = group.Write(iten, values);
if (results == null)
{
return Writes(ItemName, values);
}
int[] re = { 0, 0 };
foreach (HRESULT i in results)
{
if (i.Succeeded)
{
re[0] += 1;
}
else
{
re[1] += 1;
}
}
Read(group);
return re;
}
public async Task<int[]> Asyncwrite(string[] ItemName, object[] values)
{
iten = new OpcDaItem[ItemName.Length];
for (int i = 0; i < ItemName.Length; i++)
{
iten[i] = group.Items.FirstOrDefault(j => j.ItemId == ItemName[i]);
}
HRESULT[] results = await group.WriteAsync(iten, values);
int[] re = { 0, 0 };
foreach (HRESULT i in results)
{
if (i.Succeeded)
{
re[0] += 1;
}
else
{
re[1] += 1;
}
}
return re;
}
public bool reconntsever(opchost o)
{
try
{
doc.Load(@"F:\work\che\OpcDal\Opc.xml");
}
catch (Exception)
{
return false;
throw;
}
if (o.progIdOrClsid != "")
{
XmlNodeList elemet = doc.GetElementsByTagName("OpcDaServer");
elemet.Item(0).InnerText = o.progIdOrClsid;
}
if (o.hostname != "")
{
XmlNodeList elemet1 = doc.GetElementsByTagName("OpcDaServer");
elemet1.Item(0).InnerText = o.hostname;
}
doc.Save(@"F:\work\che\OpcDal\Opc.xml");
if (opcsever != null)
{
opcsever.Disconnect();
}
return Opcsere();
}
}
}
  • List item
身负千斤 原创文章 3获赞 0访问量 139 关注 私信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: