Driver.cs 9.4 KB
Newer Older
cdy816's avatar
cdy816 已提交
1 2
using Cdy.Tag;
using Cdy.Tag.Driver;
cdy816's avatar
cdy816 已提交
3 4 5
using System;
using System.Collections;
using System.Collections.Generic;
cdy816's avatar
cdy816 已提交
6
using System.Diagnostics;
cdy816's avatar
cdy816 已提交
7
using System.IO;
8
using System.Threading;
cdy816's avatar
cdy816 已提交
9 10 11

namespace SimDriver
{
12
    public class Driver : Cdy.Tag.Driver.IProducterDriver
cdy816's avatar
cdy816 已提交
13 14 15 16
    {

        #region ... Variables  ...

17
        System.Collections.Generic.Dictionary<string, List<Tagbase>> mTagIdCach = new Dictionary<string, List<Tagbase>>();
cdy816's avatar
cdy816 已提交
18

19
        //private System.Timers.Timer mScanTimer;
cdy816's avatar
cdy816 已提交
20 21 22

        private short mNumber = 0;

23 24
        private bool mBoolNumber = false;

25
        private IRealTagProduct mTagService;
cdy816's avatar
cdy816 已提交
26

27 28
        private ITagHisValueProduct mTagHisValueService;

29
        //private bool mIsBusy = false;
cdy816's avatar
cdy816 已提交
30 31 32

        private StreamWriter mWriter;

cdy816's avatar
cdy816 已提交
33 34
        private DateTime mLastProcessTime = DateTime.Now;

35
        //private int mBusyCount = 0;
36

37 38
        private bool mIsSecond = false;

39
        //private int mTickCount = 0;
40 41 42 43 44

        private Thread mScanThread;

        private bool mIsClosed = false;

cdy816's avatar
cdy816 已提交
45 46 47 48 49 50 51
        #endregion ...Variables...

        #region ... Events     ...

        #endregion ...Events...

        #region ... Constructor...
cdy816's avatar
cdy816 已提交
52 53 54 55 56 57 58 59 60
        /// <summary>
        /// 
        /// </summary>
        public Driver()
        {
            var vfile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(this.GetType().Assembly.Location), DateTime.Now.ToString("yyyyMMddHHmmss") + ".log");
            mWriter = new StreamWriter(  System.IO.File.Open(vfile, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite));
            
        }
cdy816's avatar
cdy816 已提交
61 62 63



cdy816's avatar
cdy816 已提交
64 65 66 67 68 69 70 71 72
        #endregion ...Constructor...

        #region ... Properties ...

        /// <summary>
        /// 
        /// </summary>
        public string Name => "Sim";

cdy816's avatar
cdy816 已提交
73 74 75
        /// <summary>
        /// 
        /// </summary>
cdy816's avatar
cdy816 已提交
76 77 78 79
        public string[] Registors
        {
            get
            {
80
                return new string[] { "cos", "sin", "step","steppoint", "square" };
cdy816's avatar
cdy816 已提交
81 82 83
            }
        }

cdy816's avatar
cdy816 已提交
84 85 86 87
        #endregion ...Properties...

        #region ... Methods    ...

cdy816's avatar
cdy816 已提交
88 89 90 91 92 93 94
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sval"></param>
        private void Log(string sval)
        {
            mWriter.WriteLine(sval);
95
            mWriter.Flush();
cdy816's avatar
cdy816 已提交
96
        }
cdy816's avatar
cdy816 已提交
97 98 99 100 101

        /// <summary>
        /// 
        /// </summary>
        /// <param name="tagQuery"></param>
102
        private void InitTagCach(IRealTagProduct tagQuery)
cdy816's avatar
cdy816 已提交
103
        {
104
            mTagIdCach = tagQuery.GetTagsByLinkAddress(new List<string>() { "Sim:cos", "Sim:sin", "Sim:step", "Sim:steppoint", "Sim:square" });
cdy816's avatar
cdy816 已提交
105 106 107 108 109 110 111
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="tagQuery"></param>
        /// <returns></returns>
112
        public bool Start(IRealTagProduct tagQuery, ITagHisValueProduct tagHisValueService)
cdy816's avatar
cdy816 已提交
113
        {
cdy816's avatar
cdy816 已提交
114
            mIsClosed = false;
cdy816's avatar
cdy816 已提交
115
            mTagService = tagQuery;
116
            mTagHisValueService = tagHisValueService;
cdy816's avatar
cdy816 已提交
117
            InitTagCach(tagQuery);
118 119 120 121 122 123
            mScanThread = new Thread(ScanThreadPro);
            mScanThread.IsBackground = true;
            mScanThread.Start();
            //mScanTimer = new System.Timers.Timer(100);
            //mScanTimer.Elapsed += MScanTimer_Elapsed;
            //mScanTimer.Start();
cdy816's avatar
cdy816 已提交
124 125 126
            return true;
        }

127 128 129 130 131
        private void ScanThreadPro()
        {
            while (!mIsClosed)
            {
                DateTime time = DateTime.Now;
cdy816's avatar
cdy816 已提交
132 133

                if ((mLastProcessTime-time).TotalSeconds>1000)
134 135 136
                {
                    LoggerService.Service.Warn("Sim Driver", "出现阻塞");
                }
137

138 139 140 141
                mLastProcessTime = time;
                if (!mIsSecond)
                {
                    mNumber++;
142
                    mNumber = mNumber >= (short)360 ? (short)0 : mNumber;
143 144 145 146 147 148 149 150 151 152 153 154 155
                    mIsSecond = true;
                }
                else
                {
                    mIsSecond = false;
                }


                if (mNumber % 100 == 0) mBoolNumber = !mBoolNumber;

                double fval = Math.Cos(mNumber / 180.0 * Math.PI);
                double sval = Math.Sin(mNumber / 180.0 * Math.PI);

cdy816's avatar
cdy816 已提交
156
#if DEBUG
157 158
            Stopwatch sw = new Stopwatch();
            sw.Start();
cdy816's avatar
cdy816 已提交
159
#endif
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181


                System.Threading.Tasks.Parallel.ForEach(mTagIdCach, (vv) =>
                {
                    if (vv.Key == "Sim:cos")
                    {
                        mTagService.SetTagValue(vv.Value, fval);
                    }
                    else if (vv.Key == "Sim:sin")
                    {
                        mTagService.SetTagValue(vv.Value, sval);
                    }
                    else if (vv.Key == "Sim:step")
                    {
                        mTagService.SetTagValue(vv.Value, mNumber);
                    }
                    else if (vv.Key == "Sim:steppoint")
                    {
                        mTagService.SetPointValue(vv.Value, mNumber, mNumber, mNumber);
                    }
                    else if (vv.Key == "Sim:square")
                    {
182
                        mTagService.SetTagValue(vv.Value, mBoolNumber);
183 184
                    }
                });
185
                mTagService.SubmiteNotifyChanged();
186

187 188
                int delay = (int)(500 - (DateTime.Now - mLastProcessTime).TotalMilliseconds);
                if(delay < 0)
189
                {
190
                    delay = 1;
191
                }
cdy816's avatar
cdy816 已提交
192 193 194
#if DEBUG
                sw.Stop();
                if (mNumber%10 == 0)
cdy816's avatar
cdy816 已提交
195
                LoggerService.Service.Debug("Sim Driver", "set value elapsed:" + sw.ElapsedMilliseconds);
cdy816's avatar
cdy816 已提交
196
#endif
197
                Thread.Sleep(delay);
198
            }
199
        }
200

201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
//        /// <summary>
//        /// 
//        /// </summary>
//        /// <param name="sender"></param>
//        /// <param name="e"></param>
//        private void MScanTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
//        {
//            mTickCount++;
//            if (mIsBusy)
//            {
//                mBusyCount++;
//                if (mBusyCount >= 10)
//                {
//                    mBusyCount = 0;
//                    LoggerService.Service.Warn("Sim Driver", "出现阻塞");
//                }
//                return;
//            }
//            mBusyCount = 0;
//            mIsBusy = true;
//            DateTime time = DateTime.Now;
//            if (mTickCount <5)
//            {
//                mIsBusy = false;
//                return;
//            }
//            else
//            {
//                mTickCount = 0;
//            }

//            mLastProcessTime = time;
//            if(!mIsSecond)
//            {
//                mNumber++;
//                mNumber = mNumber > (short)360 ? (short)0 : mNumber;
//                mIsSecond = true;
//            }
//            else
//            {
//                mIsSecond = false;
//            }
243 244
            

245
//            if (mNumber % 100 == 0) mBoolNumber = !mBoolNumber;
cdy816's avatar
cdy816 已提交
246

247 248
//            double fval = Math.Cos(mNumber / 180.0 * Math.PI);
//            double sval = Math.Sin(mNumber / 180.0 * Math.PI);
cdy816's avatar
cdy816 已提交
249

250 251 252 253
//#if DEBUG
//            Stopwatch sw = new Stopwatch();
//            sw.Start();
//            Log("Sim:Sin " + fval + " " + "Sim:Cos " + sval + " " + "Sim:step " + mNumber + "  " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
254

255
//#endif
256

cdy816's avatar
cdy816 已提交
257

258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
//            System.Threading.Tasks.Parallel.ForEach(mTagIdCach, (vv) =>
//            {
//                if (vv.Key == "Sim:cos")
//                {
//                    mTagService.SetTagValue(vv.Value, fval);
//                }
//                else if (vv.Key == "Sim:sin")
//                {
//                    mTagService.SetTagValue(vv.Value, sval);
//                }
//                else if (vv.Key == "Sim:step")
//                {
//                    mTagService.SetTagValue(vv.Value, mNumber);
//                }
//                else if(vv.Key == "Sim:steppoint")
//                {
//                    mTagService.SetPointValue(vv.Value,mNumber,mNumber,mNumber);
//                }
//                else if (vv.Key == "Sim:square")
//                {
//                    mTagService.SetPointValue(vv.Value, mBoolNumber);
//                }
//            });
cdy816's avatar
cdy816 已提交
281

282 283
//#if DEBUG
//            sw.Stop();
cdy816's avatar
cdy816 已提交
284

285 286 287 288
//            LoggerService.Service.Info("Sim Driver", "set value elapsed:" + sw.ElapsedMilliseconds + " total count:" + mNumber + " cos:" + Math.Cos(mNumber / 180.0 * Math.PI) + " sin:" + Math.Sin(mNumber / 180.0 * Math.PI));
//#endif
//            mIsBusy = false;
//        }
cdy816's avatar
cdy816 已提交
289 290 291 292 293 294 295

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public bool Stop()
        {
296 297 298
            //mScanTimer.Stop();
            mIsClosed = true;
           // mScanThread.Abort();
cdy816's avatar
cdy816 已提交
299
            mWriter.Close();
cdy816's avatar
cdy816 已提交
300 301 302
            return true;
        }

cdy816's avatar
cdy816 已提交
303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
        /// <summary>
        /// 
        /// </summary>
        /// <param name="database"></param>
        /// <returns></returns>
        public Dictionary<string, string> GetConfig(string database)
        {
            return null;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="database"></param>
        /// <param name="config"></param>
        public void UpdateConfig(string database, Dictionary<string, string> config)
        {

        }

323 324 325 326 327
        public bool Init()
        {
            return true;
        }

cdy816's avatar
cdy816 已提交
328

cdy816's avatar
cdy816 已提交
329 330 331 332 333 334 335

        #endregion ...Methods...

        #region ... Interfaces ...

        #endregion ...Interfaces...

cdy816's avatar
cdy816 已提交
336 337


cdy816's avatar
cdy816 已提交
338 339
    }
}