2013-04-18 58 views
4

Profibus DP를 통해 PLC와 통신하는 하드웨어를 가지고 있는데, 이는 "44 79 FF FF"인 16 진수의 데이터 4 바이트를 보내고 내가 선언 한 PLC 프로그램에서 을 BYTE 이 입력 데이터의 배열. 문제는 PLC에서 내가받은 바이트 데이터 배열은 16 진수의 10 진수 값인 "66 121 255 255"이지만, 내 목표는 에 해당 값을 실제 값으로 변환하는 것이며, 내가 예상 한 가치를 얻지 못했습니다.PLC 구조화 된 텍스트로 10 진수를 실수 (실수)로 변환합니다. 내가 기대하는 가치를 얻지 못한다. (IEEE-754)

모든 BYTES를 삽입하는 DWORD (4bytesData)를 만들었습니다. 내가 4bytesData에 4 바이트를 삽입하기 전에 그래서 바이트는 다음과 같습니다 in1 = 68, in2 = 121,

4bytesData := (SHL(SHL(SHL(BYTE_TO_DWORD(in1), 8) OR BYTE_TO_DWORD(in2), 8) OR  BYTE_TO_DWORD(in3), 8) OR in4); 

realValue := DWORD_TO_REAL(4bytesData); 

& in4 = 255

in3 = 255 경우 IN4 바이트 0-3 & IN3 IN1, IN2.

나는 값을 얻는다. 4bytesData = 1,148,846,079 & realValue = 1.148846e + 009

내가 realValue에서 얻을 것으로 예상하고있어 값은 = 9.9999993896484375E2

나는이 웹 사이트 ( IEEE754 Analyzer/Converter)과 변환을 사용하는 경우 16 진수 값 (4479FFFF) 내가 원하는 값을 얻었습니다. 그리고 십진수 값 (1148846079)을 삽입하면 PLC에서받은 값과 동일한 값을 얻게됩니다.

내 문제를 이해하시기 바랍니다. Advance에서 많은 감사를드립니다.

+1

in1 = 68 ... 생각합니다;) –

+0

맞습니다! 나는 그것을 편집했다. 감사. – hijack

답변

3

당신은 이미 알아 냈습니다. 당신은 그것을 깨닫지 못했을 것입니다. DWORD_TO_REAL 변환은 4bytesData에 저장된 정수 (16 진수) 값을 가져와 IEEE754 REAL 형식으로 변환합니다.

이것은 사용자가 원하는 것이 아닙니다. 4479FFFF입니다. IEEE754 REAL 형식의입니다.이 값을 사용하고 REAL을 DWORD로 해석 한 다음 DWORD 값을 REAL로 변환하면됩니다. 짧은 대답은 변환이 필요 없다는 것입니다. 4bytesData은 이미 올바른 형식입니다.

편집

는 의견을 후속 :

enter image description here

여기 FunctionBlock2 (REAL) 린, 패주 (REAL)을 delclares 및 rOut:=rIn;을 설정합니다. 이것은 ST의 강제 형변환을 둘러싼 다.D2000에 저장된 데이터는 변경되지 않습니다. 동일한 이진 데이터입니다. 상위 기능 블록은이를 메모리에 저장하고 맨 아래 기능 블록은 메모리에서 읽는 중입니다. 유일한 차이점은 상단 렁이 그것을 (표시 용으로) DWORD로 해석하고 하단 렁은 REAL로 해석한다는 것입니다.

내가는 Beckhoff 설명서를 읽어 봤는데 편집. 다른 옵션이있는 것 같습니다. 아마도 declaring a DWORD and REAL at the same memory location을 시도하십시오. 그렇지 않은 경우 pointers would let you do it (형식 제한이 Beckhoff가있는 포인터에도 적용되는지 확실하지 않음)

+0

답변 해 주셔서 감사합니다. "DWORD_TO_REAL"변환을 사용하지 않아도됩니다. 그러나 나는 그것을 제거하면 여전히 "1.148846e + 009"값을 얻고 있으므로 여전히 동일합니다. 4bytesData는 "1148846079"입니다. – hijack

+0

@hijack 명시 적 변환을 제거하더라도 ... 사용중인 PLC에 따라 자동으로 전환이 발생합니다. 4bytesData를 DWORD 대신 REAL 유형으로 선언 해보십시오. –

+0

아마도 그럴 것입니다. (나는 Beckhoff를 사용하고있다.) 4bytesData로 바이트를 이동시킬 때 오류가 발생한다 : "타입 불일치가 파라미터에 'REAL'을 'BYTE'로 변환 할 수 없다. – hijack

0

바이트 순서가 잘못되어 루틴이 반대가 예상됩니다. endianness. 4479FFFF 대신 FFFF7944를 시도하고 예상대로 9.9999993896484375E2를 얻는 지 확인하십시오. 또한, IEEE754 (필요하면 바이트 순서 변경)로 1148846079는 00F4884E이므로 인식에서 하나 이상의 오류가있을 수 있습니다.

+0

좋은 아이디어. 그러나 주문을 변경하면 4294932804 (십진수)와 4.294933e + 009 (실제)가됩니다. – hijack

+0

그래, 내가 왜 이해가 안 돼요 1148846079 .. PLC는 내가 인식하지 못하는 변환을해야만합니다. – hijack

+0

이제 알겠습니다. DWORD_TO_REAL()에 대한 도움말을 읽어야합니다. IEEE754 표준 부동 소수점 형식을 나타내는 바이트 (해당 함수에 대한 잘못된 인식)를 전달할 것으로 예상되지만 대신 예제 4는 4.0으로, 1000은 1000.0으로 변환됩니다. 원시 IEEE754 4 바이트를 실수로 변환하거나 4 바이트를 올바른 엔디안 순서로 바이트 단위로 직접 부동 소수점에 쓰는 함수를 찾아야합니다. – avra

0

모든 SHL이 중첩되도록주의하십시오. V2.3에서는 약 4 깊이 만 갈 수 있습니다. 다른 컨트롤러 (타겟 용 컴파일러)에서 중첩하여 잘못된 평가를 얻을 수 있다고 생각했습니다. 그들을 자신의 라인에 보관하는 것이 가장 좋습니다. 4 줄의 코드를 FUNCTION BYTES_TO_DWROD : DWORD 함수에 넣으면 모든 변환을 반복해서 사용하는 것이 좋습니다.

0

포인터를 사용하여 DWORD에서 REAL로 값을 이동하십시오. 변환을 막는 것 같습니다.