2017-02-03 1 views
2

현재 여러 테스트 카메라 (모든 Onvif 호환)에서 릴레이 출력 상태를 전환하려고합니다. Hikvision PTZ 카메라의 릴레이 출력 목록을 검색하려고하면 혼란이 시작됩니다. 성공적으로 릴레이 출력을 얻을 수 있으며 (1 개만 있음) 열거 나 닫을 수있는 'RelayLogicalState'를 요청할 수 있습니다.Onvif 프로토콜을 사용하여 릴레이 출력 상태를 전환하는 방법

'SetRelayOutputState'를 사용하는 릴레이 출력을 전환 할 때 해당 매개 변수는 전환 할 릴레이 출력의 토큰과 'RelayLogicalState'입니다. RelayLogicalState는 단지 1 개의 릴레이 출력 만이 그 토큰을 보낼 수 있기 때문에 여기서 잘못하지 않는 2 개의 항목 (활성 또는 비활성)의 열거 형입니다. 릴레이 출력의 상태를 전환 할 수 있지만 'GetrelayOutputs'를 다시 호출하여 상태를 확인하면이 함수는 입력을 항상 '비활성'으로 설정합니다.

BOSCH의 경우 릴레이 출력을 다시 검색 할 수 있지만 1은 있지만 'SetRelayOutputState'를 호출하면 2 개의 RelayLogicalState 중 하나가 호출되지 않습니다. 참고로

: http://www.onvif.org/ver10/deviceio.wsdl

두 카메라는 최신 펌웨어를 설치하고 ONVIF 장치 관리자에 따라 모두 ONVIF 버전 2.0을 사용합니다.

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)); 

답변

1

나도 그 몇 가지 문제가 있었다 :

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()); 
    } 

편집은 결국 나는 다음과 같은 방식으로 작업되었다. SetRelayOutputSettings이라는 또 다른 onvif 함수가 있습니다.
개방

idleState/가까운
delayTime 모드가 "단 안정"의 경우는 다시 idleState에 올 것이다
시간
모드 : 당신이 설정의 몇 가지있다
쌍 안정 - 당신은 요 변화 상태를 처리해야합니다. urself에는
단 안정 - 당신이 상태를 설정 한 후, 그것은 "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"); 
} 

희망이 당신을 돕습니다.

+0

의견을 보내 주셔서 감사 드리며, 저에게 도움이되지 않아 다른 브랜드를 사용해보실 수 있습니다. –

관련 문제