0

我刚开始强迫自己使用实体框架(我知道我落后了很长一段路),但我已经陷入了第一个障碍。

我正在编写的程序只是观察 PLC 使其成为现实。当它变为真时,会触发一个事件,然后将值(目前是随机的)输入到 SQL 中。然后我将该位设置为假。

我遇到的问题是事件触发一次,条目被添加,并且位被设置为假。但是,该事件永远不会再次触发。如果我注释掉所有的 SQL 位然后只是将位设置为 false 那么它可以完美地工作并触发多次。

这是我拥有的大部分代码。

任何帮助将非常感激。

static void Main(string[] args)
{
    PlcListener plcListener = new PlcListener();
    plcLister.BitChanged += (bitVal) => On_BitChanged(bitVal, plcListener)
    plcListner.Start();
}

private static void On_BitChanged(bool bitVal, PlcListener plcListner)
{
    SqlEntities sqlEntity = new SqlEntities();
    SampleData sampleData = new SampleData(){ Data = new Random().Next(); };

    sqlEntity.AddToSampleDatas(sampleData);
    sqlEntity.SaveChanges();

    plcListener.Confirm();
}



public class PlcListener
{
    public void Start()
    {
        OPCServer opcServer = new OPCServer();
        opcServer.DataChanged += On_DataChanged;
    }

    public void Confirm()
    {
        //Code to set bit to false
    }

    public void On_DataChanged(bool bitVal.......)
    {
        if(bitVal)
        {
            BitChangedEventHandler handler = BitChanged;
            if (handler != null)
            {
               handler(bitVal);
            }
        }
    }

    public delegate void BitChangedEventHandler(bool bitValue);
    public event BitChangedEventHandler BitChanged;
}
4

1 回答 1

0

您没有提到您正在使用哪个 OpcServer 组件,但最可能的问题是 DataChange 在 COM 回调线程中进入您的应用程序,并且在处理回调时不允许您写回 COM。您只需记录传入的值并在您自己的处理程序线程中进行实际处理,然后在 PLC 中将该位设置回 false。

于 2013-02-21T17:39:09.660 回答