private void ConfigureIoMap(IList <SlaveInfo> slaves) { var ioMapByteOffset = 0; var ioMapBitOffset = 0; var slavePdoOffsets = default(int[]); var slaveRxPdoOffsets = new int[slaves.Count() + 1]; var slaveTxPdoOffsets = new int[slaves.Count() + 1]; _actualIoMapSize = EcHL.ConfigureIoMap(this.Context, _ioMapPtr, slaveRxPdoOffsets, slaveTxPdoOffsets, out _expectedWorkingCounter); foreach (DataDirection dataDirection in Enum.GetValues(typeof(DataDirection))) { switch (dataDirection) { case DataDirection.Output: slavePdoOffsets = slaveRxPdoOffsets; break; case DataDirection.Input: slavePdoOffsets = slaveTxPdoOffsets; break; default: throw new NotImplementedException(); } foreach (var slave in slaves) { ioMapByteOffset = slavePdoOffsets[slaves.ToList().IndexOf(slave) + 1]; foreach (var variable in slave.DynamicData.Pdos.Where(x => x.SyncManager >= 0).ToList().SelectMany(x => x.Variables).ToList().Where(x => x.DataDirection == dataDirection)) { variable.DataPtr = IntPtr.Add(_ioMapPtr, ioMapByteOffset); variable.BitOffset = ioMapBitOffset; if (variable.DataType == EthercatDataType.Boolean) { variable.BitOffset = ioMapBitOffset; // bool is treated as bit-oriented } Debug.WriteLine($"{variable.Name} {variable.DataPtr.ToInt64() - _ioMapPtr.ToInt64()}/{variable.BitOffset}"); ioMapBitOffset += variable.BitLength; if (ioMapBitOffset > 7) { ioMapBitOffset = ioMapBitOffset % 8; ioMapByteOffset += (variable.BitLength + 7) / 8; } } } } _logger.LogInformation($"IO map configured ({slaves.Count()} {(slaves.Count() > 1 ? "slaves" : "slave")}, {_actualIoMapSize} bytes)"); }