Beispiel #1
0
        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)");
        }