The most likely problems are either due to flipped normals, fast moving soft body (moving so fast as to jump through the plane before collision can be detected), or inappropriate Collision settings.
The first thing to point out is that the collision is an approximation. The soft body solver steps the soft body vertices through a 'step' and compares the positions to any collision surfaces. If the new vertex position is within one of the collision 'zones' (ie, the 'Outer' and 'Inner' settings on the Collision panel) then it will be repelled by the surface on the next 'step'. If the step size is too large for a fast moving vertex to be detected then it can pass straight through a surface unnoticed. To resolve this issue you can tweak the Soft Body Solver settings - drastically increase the Min Step setting and the steps will be considerably shorter, resulting in the fast moving vertices being more frequently sampled and, hopefully, hitting the collision zones.
The next problem is with flipped normals. If a vertex approaches the opposite side of a surface then instead of hitting the surface it will be drawn through the surface to the other side. The normals should (almost) always point to the "outside" of the object so as to repel collisions to the exterior.
The final problem is setting the Internal collision bounds larger than the depth of the object. The collision settings are in scene units (so, by default, Blender Units). The default 'Inner' collision settings of 0.2 are only appropriate for objects that are more than 0.4 units in depth. For example, a cube with 0.4 units per side. This would mean that down to 0.2 units below the surface would be considered for repulsion from that closest surface but anything below that would be repelled out of the other side. If you set collision 'Inner' greater than half the depth of the surface then you start to get strange results where the top surface collision zone interferes with the opposite surface collision zone. IF the Inner is set to more that the total thickness of the object then you can end up with a situation where vertices close to the surface are drawn through the surface as they are within the collision zone of the far side of the object!
So, follow the following rules :
- Keep Normals pointing 'out' of the object
- Set Min Step high enough to ensure any vertex motion is not too great per step - faster objects require more steps but more steps take longer to calculate
- Carefully select collision depths to avoid overlapping zones - avoid Inner being more than half the minimum thickness of the mesh.