1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
| OPCGroup LocalGroup = LocalGroups.Add("LocalGroups"); LocalGroup.IsActive = true; LocalGroup.IsSubscribed = true; LocalGroup.UpdateRate = 10000; //每十秒刷新一次 LocalGroup.DataChange += Group_DataChange; //事件 LocalGroup.AsyncWriteComplete += LocalGroup_AsyncWriteComplete; //数据变化事件 LocalGroup.AsyncReadComplete += LocalGroup_AsyncReadComplete; //异步读结束事件
ClientHandleItemIDPairs.Add(0, ""); ClientHandleItemIDPairs.Add(1, "Random.Int4"); ClientHandleItemIDPairs.Add(2, "Random.Int2");
try { Array ServerHandles; Array Errors; int CancelID; //批量添加监控节点 LocalGroup.OPCItems.AddItems(2, ClientHandleItemIDPairs.Values.ToArray(), ClientHandleItemIDPairs.Keys.ToArray(), out ServerHandles, out Errors); //添加单个监控节点 OPCItem SingleItem = LocalGroup.OPCItems.AddItem("Write Only.String", 3); ClientHandleItemIDPairs.Add(3, "Write Only.String");
for (int i = 1; i <= ServerHandles.Length; i++) { Console.WriteLine($"Added Item: {LocalGroup.OPCItems.GetOPCItem((int)ServerHandles.GetValue(i)).ItemID}, Error: {LocalOpcServer.GetErrorString((int)Errors.GetValue(i))}"); }
Array outValues; object outQualities; object outTimestamps;
//同步读 LocalGroup.SyncRead((short)OPCAutomation.OPCDataSource.OPCDevice, ServerHandles.Length, ServerHandles, out outValues, out Errors, out outQualities, out outTimestamps); for (int i = 1; i <= ServerHandles.Length; i++) { Console.WriteLine($"SyncRead Item {LocalGroup.OPCItems.GetOPCItem((int)ServerHandles.GetValue(i)).ItemID} Value: {outValues.GetValue(i)}, Quality: {(outQualities as Array).GetValue(i)}, Timestamp: {(outTimestamps as Array).GetValue(i)}, Error: {LocalOpcServer.GetErrorString((int)Errors.GetValue(i))}"); }
//此处添加的0和""是必须的,否则出错! int[] WriteServerHandles = new[] { 0, SingleItem.ServerHandle }; object[] WriteValues = new object[] { "", "Hello" }; //同步写 LocalGroup.SyncWrite(1, WriteServerHandles.ToArray(), WriteValues, out Errors);
//异步读, TransactionID == 1 LocalGroup.AsyncRead(ServerHandles.Length, ServerHandles, out Errors, 1, out CancelID); //异步写, TransactionID == 2 LocalGroup.AsyncWrite(1, WriteServerHandles.ToArray(), WriteValues, out Errors, 2, out CancelID); //异步刷新, TransactionID == 3 LocalGroup.AsyncRefresh((short)OPCAutomation.OPCDataSource.OPCDevice, 3, out CancelID); } catch (Exception ex) { MessageBox.Show($"错误信息{ex.Message} {ex.StackTrace}", "错误"); }
private void LocalGroup_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors) { if (TransactionID == 2) { for (int i = 1; i <= NumItems; i++) { Console.WriteLine($"Async Write {ClientHandleItemIDPairs[(int)ClientHandles.GetValue(i)]} Complete, Error: {LocalOpcServer.GetErrorString((int)Errors.GetValue(i))}"); } } } private void LocalGroup_AsyncReadComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps, ref Array Errors) { if (TransactionID == 1) { for (int i = 1; i <= NumItems; i++) { Console.WriteLine($"Async Read {ClientHandleItemIDPairs[(int)ClientHandles.GetValue(i)]} Complete, Value: {ItemValues.GetValue(i)}, Quality: {GetQualityString((int)Qualities.GetValue(i))}, TimeStamps: {((DateTime)TimeStamps.GetValue(i)).ToString("yyyy-MM-dd HH:mm:ss")}, Error: {LocalOpcServer.GetErrorString((int)Errors.GetValue(i))}"); } } }
private void Group_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) { for (int i = 1; i <= NumItems; i++) { Console.WriteLine($"DataChange {ClientHandleItemIDPairs[(int)ClientHandles.GetValue(i)]} Complete, Value: {ItemValues.GetValue(i)}, Quality: {GetQualityString((int)Qualities.GetValue(i))}, TimeStamps: {((DateTime)TimeStamps.GetValue(i)).ToString("yyyy-MM-dd HH:mm:ss")}"); } }
public static string GetQualityString(int QualityCode) { switch (QualityCode) { case 0: return "Bad"; case 1: return "Bad, Low Limited"; case 2: return "Bad, High Limited"; case 3: return "Bad, Constant"; case 4: return "Bad, Configuration Error"; case 5: return "Bad, Configuration Error, Low Limited"; case 6: return "Bad, Configuration Error, High Limited"; case 7: return "Bad, Configuration Error, Constant"; case 8: return "Bad, Not Connected"; case 9: return "Bad, Not Connected, Low Limited"; case 10: return "Bad, Not Connected, High Limited"; case 11: return "Bad, Not Connected, Constant"; case 12: return "Bad, Device Failure"; case 13: return "Bad, Device Failure, Low Limited"; case 14: return "Bad, Device Failure, High Limited"; case 15: return "Bad, Device Failure, Constant"; case 16: return "Bad, Sensor Failure"; case 17: return "Bad, Sensor Failure, Low Limited"; case 18: return "Bad, Sensor Failure, High Limited"; case 19: return "Bad, Sensor Failure, Constant"; case 20: return "Bad, Last Known Value"; case 21: return "Bad, Last Known Value, Low Limited"; case 22: return "Bad, Last Known Value, High Limited"; case 23: return "Bad, Last Known Value, Constant"; case 24: return "Bad, Comm Failure"; case 25: return "Bad, Comm Failure, Low Limited"; case 26: return "Bad, Comm Failure, High Limited"; case 27: return "Bad, Comm Failure, Constant"; case 28: return "Bad, Out of Service"; case 29: return "Bad, Out of Service, Low Limited"; case 30: return "Bad, Out of Service, High Limited"; case 31: return "Bad, Out of Service, Constant"; case 32: return "Bad, Waiting for Initial Data"; case 33: return "Bad, Waiting for Initial Data, Low Limited"; case 34: return "Bad, Waiting for Initial Data, High Limited"; case 35: return "Bad, Waiting for Initial Data, Constant"; case 64: return "Uncertain"; case 65: return "Uncertain, Low Limited"; case 66: return "Uncertain, High Limited"; case 67: return "Uncertain, Constant"; case 68: return "Uncertain, Last Usable Value"; case 69: return "Uncertain, Last Usable Value, Low Limited"; case 70: return "Uncertain, Last Usable Value, High Limited"; case 71: return "Uncertain, Last Usable Value, Constant"; case 80: return "Uncertain, Sensor Not Accurate"; case 81: return "Uncertain, Sensor Not Accurate, Low Limited"; case 82: return "Uncertain, Sensor Not Accurate, High Limited"; case 83: return "Uncertain, Sensor Not Accurate, Constant"; case 84: return "Uncertain, Engineering Units Exceeded"; case 85: return "Uncertain, Engineering Units Exceeded, Low Limited"; case 86: return "Uncertain, Engineering Units Exceeded, High Limited"; case 87: return "Uncertain, Engineering Units Exceeded, Constant"; case 88: return "Uncertain, Sub-Normal"; case 89: return "Uncertain, Sub-Normal, Low Limited"; case 90: return "Uncertain, Sub-Normal, High Limited"; case 91: return "Uncertain, Sub-Normal, Constant"; case 192: return "Good"; case 193: return "Good, Low Limited"; case 194: return "Good, High Limited"; case 195: return "Good, Constant"; case 216: return "Good, Local Override"; case 217: return "Good, Local Override, Low Limited"; case 218: return "Good, Local Override, High Limited"; case 219: return "Good, Local Override, Constant"; default: return "INVALIDE QUALITY CODE!"; } }
|