我目前正在尝试在多个测试相机(均符合Onvif规范)上切换继电器输出的状态。当尝试检索海康威视PTZ摄像机的继电器输出列表时,混乱就开始了。我可以成功获取继电器输出(它只有1个),并要求它的“ RelayLogicalState”可以打开或关闭。

为了切换继电器输出,我使用“ SetRelayOutputState”,其参数是要切换的继电器输出的令牌和“ RelayLogicalState”。由于只有1个继电器输出,我只能发送该令牌,因此'RelayLogicalState'是2个项(活动或不活动)的枚举,在这里没什么大不了的。我可以切换继电器输出的状态,但是当再次调用“ GetrelayOutputs”以检查其状态时,此功能将始终将输入设置为“无效”。

对于BOSCH,我可以再次检索继电器输出,仅存在1,但调用“ SetRelayOutputState”对2个“ RelayLogicalState”中的任何一个都不起作用。

供参考:http://www.onvif.org/ver10/deviceio.wsdl

两台摄像机均安装了最新固件,并且根据Onvif设备管理器均使用Onvif 2.0版。

    private void OutputLowButton_Click(object sender, EventArgs e)
    {
        if (relayOutputs != null)
        {
            //only 1 present so we take the first for this example
            var output = relayOutputs.First();
            execute(() => IOClient.SetRelayOutputState(output.token, RelayLogicalState.inactive));
        }
    }
    private void OutputHighButton_Click(object sender, EventArgs e)
    {
        if (relayOutputs != null)
        {
            //only 1 present so we take the first for this example
            var output = relayOutputs.First();
            execute(() => IOClient.SetRelayOutputState(output.token, RelayLogicalState.active));
        }
    }
    private void OutputStateButton_Click(object sender, EventArgs e)
    {
        //only 1 present so we take the first for this example
        var relayOutputs = execute(() => IOClient.GetRelayOutputs());
        if(relayOutputs != null)
            MessageBox.Show(relayOutputs.First().Properties.IdleState.ToString());
    }


编辑

最终,我以以下方式工作:

 relayOutput.Properties.Mode = Onv_Device_Management.RelayMode.Bistable;
            relayOutput.Properties.IdleState = Onv_Device_Management.RelayIdleState.open;
            TryCatch(() => deviceClient.SetRelayOutputSettingsAsync(relayOutput.token, relayOutput.Properties));
            TryCatch(() => deviceClient.SetRelayOutputState(relayOutput.token, Onv_Device_Management.RelayLogicalState.active));

最佳答案

我也有一些问题。还有一个称为SetRelayOutputSettings的onvif函数。您在此处有几个设置:

idleState
开关
延迟时间
如果模式为“单稳态”,它将返回到idleState的时间
模式
双稳态-您必须自己处理状态变化
单稳态-设置状态后,在“ delayTime”之后它将返回到idleState

当然,您还必须在此交付令牌。仍然要解决问题,我不得不按此顺序调用函数(伪代码,我不是c#):

void SetState(string token, bool bOpen) // true if high, false if low
{
   SetRelayOutputSettings(token, bOpen, "bistable", 20);
   SetRelayOutputState(token, "active");
   SetRelayOutputState(token, "inactive");
}


希望对您有所帮助。

10-08 14:34