/// <summary> /// PLCからのデータ取得 /// 大量のReadが発生しないように、上位概念において連続AddressをMergeして高速化を図ることにしているので、これ以外のReadMethosは現状未使用となっている /// </summary> /// <param name="unitAdr"></param> /// <param name="acMem"></param> /// <param name="readOffset"></param> /// <param name="length"></param> /// <param name="data"></param> /// <returns></returns> public CLK_ReturnCode Read(EventMemory memoryType, UInt32 readOffset, out UInt16[] data, UInt32 wordLength = 1) { CLK_ReturnCode result = CLK_ReturnCode.CLK_SUCCESS; if (memoryType == EventMemory.DM && readOffset > ClkLibConstants.DataLinkEndAddressDM) { // DM で、DataLink対象外のMemoryは、FinsCommandで取得する。→送信&受信待ちとなるので、取得時間が遅くなるけどね・・ var wordLengthWithHeader = wordLength + ClkLibConstants.FinsReceiveHeaderSizeAsWord; data = new UInt16[wordLengthWithHeader]; result = (CLK_ReturnCode)ClkLib_ReadAsUInt16ByFinsAtDM(UnitAdr, readOffset, data, wordLength, ClkLibConstants.FinsReceiveCommandWaitTime); data = data.Skip(ClkLibConstants.FinsReceiveHeaderSizeAsWord).ToArray(); SwapX2(data); return(result); } else { data = new UInt16[wordLength]; result = (CLK_ReturnCode)ClkLib_ReadAsUInt16(UnitAdr, memoryType, readOffset, data, wordLength); // DWORD 時、ここにSwapX2(data)いるかも。未検証。データが結局なかったので } if (result != CLK_ReturnCode.CLK_SUCCESS) { var sb = new StringBuilder("Read error "); sb.Append(result).Append(":"); sb.Append(memoryType).Append(","); sb.Append(readOffset).Append(","); sb.Append(wordLength).Append(","); data.ToList().ForEach(f => sb.Append(f)); Log.Error(sb.ToString()); } return(result); }